Flutter音频输出插件sariska_flutter_audio_output的使用

Flutter音频输出插件sariska_flutter_audio_output的使用

flutter_audio_output 插件允许你获取当前的音频输出设备,监听输入设备的变化,并切换音频输入/输出设备。

开始使用

以下是一个完整的示例,展示了如何在Flutter应用中使用flutter_audio_output插件来控制音频输出设备。

import 'package:flutter/material.dart';
import 'package:flutter_audio_output/flutter_audio_output.dart';
import 'dart:async';
import 'package:logger/logger.dart';

import 'package:just_audio/just_audio.dart';

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  late AudioPlayer _audioPlayer;
  final logger = Logger();

  late AudioInput _currentInput = const AudioInput("unknown", 0);
  late List<AudioInput> _availableInputs = [];
  bool isSpeaker = true;

  [@override](/user/override)
  void initState() {
    _audioPlayer = AudioPlayer();
    _audioPlayer
        .setAudioSource(AudioSource.uri(
      Uri.parse('asset:///assets/Sunflower.mp3'),
    ))
        .catchError((error) {
      print("An error occurred $error");
    });
    _audioPlayer.play();

    init();
    super.initState();
  }

  Future<void> init() async {
    FlutterAudioOutput.setListener(() async {
      logger.d("-----changed-------");
      await _getInput();
      setState(() {});
    });

    await _getInput();
    if (!mounted) return;
    setState(() {});
  }

  _getInput() async {
    _currentInput = await FlutterAudioOutput.getCurrentOutput();
    logger.w("current:$_currentInput");
    _availableInputs = await FlutterAudioOutput.getAvailableInputs();
    logger.w("available $_availableInputs");
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.all(10),
          child: Column(
            children: <Widget>[
              Text(
                "当前输出设备: ${_currentInput.name} ${_currentInput.port}",
              ),
              Divider(),
              Expanded(
                child: ListView.builder(
                  itemBuilder: (_, index) {
                    AudioInput input = _availableInputs[index];
                    return Row(
                      children: <Widget>[
                        Expanded(child: Text(input.name)),
                        Expanded(child: Text("${input.port}")),
                      ],
                    );
                  },
                  itemCount: _availableInputs.length,
                ),
              ),
              Container(
                height: 400,
                child: Row(
                  children: [
                    IconButton(
                      onPressed: () {
                        _audioPlayer.pause();
                      },
                      icon: Icon(Icons.pause_circle),
                    ),
                    IconButton(
                      onPressed: () {
                        _audioPlayer.play();
                      },
                      icon: Icon(Icons.play_circle),
                    ),
                    IconButton(
                      onPressed: () async {
                        await _getInput();
                        if (_currentInput.port == AudioPort.speaker) {
                          isSpeaker =
                              await FlutterAudioOutput.changeToReceiver();
                          setState(() {
                            isSpeaker = false;
                          });
                          print("切换到接收器 :$isSpeaker");
                        } else {
                          isSpeaker =
                              await FlutterAudioOutput.changeToSpeaker();
                          setState(() {
                            isSpeaker = true;
                          });
                          print("切换到扬声器 :$isSpeaker");
                        }
                      },
                      icon: isSpeaker == false
                          ? const Icon(
                              Icons.volume_off,
                              color: Colors.black,
                            )
                          : const Icon(
                              Icons.volume_up,
                              color: Colors.black,
                            ),
                    ),
                  ],
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

代码解释

  1. 导入必要的库:

    import 'package:flutter/material.dart';
    import 'package:flutter_audio_output/flutter_audio_output.dart';
    import 'dart:async';
    import 'package:logger/logger.dart';
    import 'package:just_audio/just_audio.dart';
    
  2. 初始化音频播放器:

    [@override](/user/override)
    void initState() {
      _audioPlayer = AudioPlayer();
      _audioPlayer
          .setAudioSource(AudioSource.uri(
        Uri.parse('asset:///assets/Sunflower.mp3'),
      ))
          .catchError((error) {
        print("An error occurred $error");
      });
      _audioPlayer.play();
    
      init();
      super.initState();
    }
    
  3. 获取当前和可用的音频输入设备:

    Future<void> init() async {
      FlutterAudioOutput.setListener(() async {
        logger.d("-----changed-------");
        await _getInput();
        setState(() {});
      });
    
      await _getInput();
      if (!mounted) return;
      setState(() {});
    }
    
    _getInput() async {
      _currentInput = await FlutterAudioOutput.getCurrentOutput();
      logger.w("current:$_currentInput");
      _availableInputs = await FlutterAudioOutput.getAvailableInputs();
      logger.w("available $_availableInputs");
    }
    
  4. 构建UI:

    [@override](/user/override)
    Widget build(BuildContext context) {
      return Scaffold(
        body: SafeArea(
          child: Padding(
            padding: const EdgeInsets.all(10),
            child: Column(
              children: <Widget>[
                Text(
                  "当前输出设备: ${_currentInput.name} ${_currentInput.port}",
                ),
                Divider(),
                Expanded(
                  child: ListView.builder(
                    itemBuilder: (_, index) {
                      AudioInput input = _availableInputs[index];
                      return Row(
                        children: <Widget>[
                          Expanded(child: Text(input.name)),
                          Expanded(child: Text("${input.port}")),
                        ],
                      );
                    },
                    itemCount: _availableInputs.length,
                  ),
                ),
                Container(
                  height: 400,
                  child: Row(
                    children: [
                      IconButton(
                        onPressed: () {
                          _audioPlayer.pause();
                        },
                        icon: Icon(Icons.pause_circle),
                      ),
                      IconButton(
                        onPressed: () {
                          _audioPlayer.play();
                        },
                        icon: Icon(Icons.play_circle),
                      ),
                      IconButton(
                        onPressed: () async {
                          await _getInput();
                          if (_currentInput.port == AudioPort.speaker) {
                            isSpeaker =
                                await FlutterAudioOutput.changeToReceiver();
                            setState(() {
                              isSpeaker = false;
                            });
                            print("切换到接收器 :$isSpeaker");
                          } else {
                            isSpeaker =
                                await FlutterAudioOutput.changeToSpeaker();
                            setState(() {
                              isSpeaker = true;
                            });
                            print("切换到扬声器 :$isSpeaker");
                          }
                        },
                        icon: isSpeaker == false
                            ? const Icon(
                                Icons.volume_off,
                                color: Colors.black,
                              )
                            : const Icon(
                                Icons.volume_up,
                                color: Colors.black,
                              ),
                      ),
                    ],
                  ),
                )
              ],
            ),
          ),
        ),
      );
    }
    

更多关于Flutter音频输出插件sariska_flutter_audio_output的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频输出插件sariska_flutter_audio_output的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Sariska 是一个基于 WebRTC 的通信框架,而 sariska_flutter_audio_output 是一个用于 Flutter 的插件,用于管理音频输出设备(如扬声器、耳机等)。以下是如何在 Flutter 项目中使用 sariska_flutter_audio_output 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 sariska_flutter_audio_output 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  sariska_flutter_audio_output: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:sariska_flutter_audio_output/sariska_flutter_audio_output.dart';

3. 初始化插件

在使用插件之前,建议先进行初始化:

void initializeAudioOutput() async {
  await SariskaFlutterAudioOutput.initialize();
}

4. 获取音频输出设备列表

你可以获取当前可用的音频输出设备列表:

void getAudioOutputDevices() async {
  List<AudioDevice> devices = await SariskaFlutterAudioOutput.getAudioOutputDevices();
  for (var device in devices) {
    print("Device ID: ${device.id}, Device Name: ${device.name}");
  }
}

5. 设置音频输出设备

你可以选择特定的音频输出设备:

void setAudioOutputDevice(String deviceId) async {
  await SariskaFlutterAudioOutput.setAudioOutputDevice(deviceId);
}

6. 获取当前音频输出设备

你可以获取当前正在使用的音频输出设备:

void getCurrentAudioOutputDevice() async {
  AudioDevice device = await SariskaFlutterAudioOutput.getCurrentAudioOutputDevice();
  print("Current Device ID: ${device.id}, Device Name: ${device.name}");
}

7. 监听音频输出设备变化

你可以监听音频输出设备的变化:

void listenToAudioOutputChanges() {
  SariskaFlutterAudioOutput.onAudioOutputChanged.listen((device) {
    print("Audio Output Changed to Device ID: ${device.id}, Device Name: ${device.name}");
  });
}

8. 示例代码

以下是一个完整的示例代码,展示了如何使用 sariska_flutter_audio_output 插件:

import 'package:flutter/material.dart';
import 'package:sariska_flutter_audio_output/sariska_flutter_audio_output.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AudioOutputScreen(),
    );
  }
}

class AudioOutputScreen extends StatefulWidget {
  [@override](/user/override)
  _AudioOutputScreenState createState() => _AudioOutputScreenState();
}

class _AudioOutputScreenState extends State<AudioOutputScreen> {
  List<AudioDevice> devices = [];
  AudioDevice? currentDevice;

  [@override](/user/override)
  void initState() {
    super.initState();
    initializeAudioOutput();
    getAudioOutputDevices();
    listenToAudioOutputChanges();
  }

  void initializeAudioOutput() async {
    await SariskaFlutterAudioOutput.initialize();
  }

  void getAudioOutputDevices() async {
    List<AudioDevice> deviceList = await SariskaFlutterAudioOutput.getAudioOutputDevices();
    setState(() {
      devices = deviceList;
    });
  }

  void setAudioOutputDevice(String deviceId) async {
    await SariskaFlutterAudioOutput.setAudioOutputDevice(deviceId);
  }

  void getCurrentAudioOutputDevice() async {
    AudioDevice device = await SariskaFlutterAudioOutput.getCurrentAudioOutputDevice();
    setState(() {
      currentDevice = device;
    });
  }

  void listenToAudioOutputChanges() {
    SariskaFlutterAudioOutput.onAudioOutputChanged.listen((device) {
      setState(() {
        currentDevice = device;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Output Example'),
      ),
      body: Column(
        children: [
          Text('Available Devices:'),
          for (var device in devices)
            ListTile(
              title: Text(device.name),
              onTap: () => setAudioOutputDevice(device.id),
            ),
          Text('Current Device: ${currentDevice?.name ?? "Unknown"}'),
        ],
      ),
    );
  }
}
回到顶部