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,
),
),
],
),
)
],
),
),
),
);
}
}
代码解释
-
导入必要的库:
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';
-
初始化音频播放器:
[@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"); }
-
构建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
更多关于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"}'),
],
),
);
}
}