Flutter音频媒体处理插件just_audio_media_kit的使用
Flutter音频媒体处理插件just_audio_media_kit的使用
just_audio_media_kit
是一个为 just_audio
提供 media_kit
绑定的Flutter插件,它允许开发者在Linux和Windows等平台上进行更强大的音频处理。以下是关于如何使用这个插件的详细指南。
安装
在你的 pubspec.yaml
中:
dependencies:
just_audio_media_kit: ^2.0.0
# 根据你的使用情况选择原生 media_kit 库:
# 注意:如果你已经包含了视频库,这些音频库是不必要的。
media_kit_libs_linux: any
media_kit_libs_windows_audio: any
注意: 对于Android、iOS和macOS,你也可以使用 just_audio_media_kit
,但需要确保包含所需的依赖项,并在 ensureInitialized()
方法中启用它们。不过,这不是必需的,因为它们已经被 just_audio
原生支持。
使用mimalloc(可选)
为了防止内存泄漏,建议用mimalloc替换默认的内存分配器。这可以通过向linux/CMakeLists.txt
添加一行来实现:
target_link_libraries(${BINARY_NAME} PRIVATE ${MIMALLOC_LIB})
初始化AudioPlayer
在使用 AudioPlayer
之前,必须调用 JustAudioMediaKit.ensureInitialized()
来初始化平台特定的功能。
// 默认情况下,Windows和Linux是启用的
JustAudioMediaKit.ensureInitialized();
// 或者,如果你想手动配置启用的平台:
// 确保为每个启用的平台包含 pubspec.yaml 中所需的依赖项!
JustAudioMediaKit.ensureInitialized(
linux: true, // 默认:true - 依赖:media_kit_libs_linux
windows: true, // 默认:true - 依赖:media_kit_libs_windows_audio
android: true, // 默认:false - 依赖:media_kit_libs_android_audio
iOS: true, // 默认:false - 依赖:media_kit_libs_ios_audio
macOS: true, // 默认:false - 依赖:media_kit_libs_macos_audio
);
插件特定配置
以下是一些可以设置的参数,这些参数必须在播放器初始化之前或之后立即设置,否则它们将不起作用。
-
MPV日志级别:
JustAudioMediaKit.mpvLogLevel = MPVLogLevel.debug;
-
解复用器缓存大小(字节):
JustAudioMediaKit.bufferSize = 8 * 1024 * 1024; // 8 MB
-
本地后端窗口和进程名称:
JustAudioMediaKit.title = 'My Audio Player App';
-
允许的协议列表:
JustAudioMediaKit.protocolWhitelist = const ['http', 'https'];
-
音高控制:
JustAudioMediaKit.pitch = true;
-
无缝播放:
JustAudioMediaKit.prefetchPlaylist = true;
-
手动指定libmpv路径(高级):
JustAudioMediaKit.ensureInitialized( libmpv: '/usr/lib/libmpv.so.2', );
功能特性
特性 | Linux, Windows |
---|---|
从URL读取 | ✅ |
从文件读取 | ✅ |
从资源读取 | ✅ |
从字节流读取 | ✅* |
请求头 | ✅ (未测试) |
DASH | ✅ (未测试) |
HLS | ✅ (未测试) |
ICY元数据 | |
缓冲状态/位置 | ✅ |
播放/暂停/快进 | ✅ |
设置音量/速度 | ✅ |
裁剪音频 | ✅ |
播放列表 | ✅ |
循环/随机播放 | ✅ |
组合音频 | |
无缝播放 | ✅** |
报告播放器错误 | ✅ |
处理电话中断 | |
缓冲/加载选项 | |
设置音高 | ✅ |
跳过静音 | |
均衡器 | |
音量增强 |
- 通过
just_audio
提供的本地HTTP服务器读取字节流
** 需要启用
注意事项
just_audio
的shuffleOrder
当前被忽略,因此推荐通过手动打乱队列并创建新的ConcatenatingAudioSource
来实现随机播放。ClippingAudioSource
当前不支持(等待 media-kit/media-kit#581 发布)。- 尚未测试多个播放器实例,但应该没有问题。
许可证
此包采用Unlicense许可证,但请注意 package:media_kit
(本包的直接依赖)采用MIT许可证。有关潜在的许可问题,请参考 package:media_kit。
示例代码
下面是一个完整的示例demo,展示了如何在Flutter项目中使用 just_audio_media_kit
。
import 'package:flutter/material.dart';
import 'package:just_audio_media_kit/just_audio_media_kit.dart';
import 'package:just_audio/just_audio.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Audio Player Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: AudioPlayerScreen(),
);
}
}
class AudioPlayerScreen extends StatefulWidget {
@override
_AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}
class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
final AudioPlayer _audioPlayer = AudioPlayer();
@override
void initState() {
super.initState();
// 初始化插件
JustAudioMediaKit.ensureInitialized();
// 设置一些插件特定配置
JustAudioMediaKit.mpvLogLevel = MPVLogLevel.debug;
JustAudioMediaKit.bufferSize = 8 * 1024 * 1024;
JustAudioMediaKit.title = 'My Audio Player App';
JustAudioMediaKit.protocolWhitelist = const ['http', 'https'];
JustAudioMediaKit.pitch = true;
// 加载音频源
_audioPlayer.setUrl('https://example.com/audio.mp3');
}
@override
void dispose() {
_audioPlayer.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Audio Player Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
StreamBuilder<PlayerState>(
stream: _audioPlayer.playerStateStream,
builder: (context, snapshot) {
final playerState = snapshot.data;
final processingState = playerState?.processingState;
final playing = playerState?.playing;
if (processingState == ProcessingState.loading ||
processingState == ProcessingState.buffering) {
return Container(
margin: EdgeInsets.all(8.0),
width: 64.0,
height: 64.0,
child: CircularProgressIndicator(),
);
} else if (playing != true) {
return IconButton(
icon: Icon(Icons.play_arrow),
iconSize: 64.0,
onPressed: _audioPlayer.play,
);
} else if (processingState != ProcessingState.completed) {
return IconButton(
icon: Icon(Icons.pause),
iconSize: 64.0,
onPressed: _audioPlayer.pause,
);
} else {
return IconButton(
icon: Icon(Icons.replay),
iconSize: 64.0,
onPressed: () => _audioPlayer.seek(Duration.zero),
);
}
},
),
StreamBuilder<Duration>(
stream: _audioPlayer.positionStream,
builder: (context, snapshot) {
final position = snapshot.data ?? Duration.zero;
return Text("${position.inMinutes}:${(position.inSeconds % 60).toString().padLeft(2, '0')}");
},
),
],
),
),
);
}
}
这个例子展示了一个简单的音频播放器界面,包括播放、暂停和显示当前播放时间的功能。希望这对您有所帮助!如果有任何问题,欢迎随时提问。
更多关于Flutter音频媒体处理插件just_audio_media_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter音频媒体处理插件just_audio_media_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用Flutter音频媒体处理插件just_audio_media_kit
的代码示例。这个插件主要用于在Flutter应用中处理音频播放和控制媒体会话。
首先,确保在你的pubspec.yaml
文件中添加依赖:
dependencies:
flutter:
sdk: flutter
just_audio: ^0.10.0 # 请检查最新版本
just_audio_media_kit: ^0.2.0 # 请检查最新版本
然后运行flutter pub get
来安装这些依赖。
接下来,在你的Flutter项目中创建一个简单的音频播放器。以下是一个完整的示例,展示如何使用just_audio
和just_audio_media_kit
:
import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart';
import 'package:just_audio_media_kit/just_audio_media_kit.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Just Audio Media Kit Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: AudioPlayerScreen(),
);
}
}
class AudioPlayerScreen extends StatefulWidget {
@override
_AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}
class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
late AudioPlayer _audioPlayer;
late MediaSessionHandler _mediaSessionHandler;
@override
void initState() {
super.initState();
_audioPlayer = AudioPlayer();
_mediaSessionHandler = MediaSessionHandler(
audioPlayer: _audioPlayer,
androidMediaSession: AndroidMediaSession(
// Optional: Customize the media session notifications
title: 'Audio Demo',
artist: 'Flutter Developer',
album: 'Demo Album',
albumArtUri: Uri.parse('https://example.com/album_art.jpg'),
),
iosMediaSession: IosMediaSession(
// Optional: Customize the media session
),
);
// Load an audio file (replace with your own URL or local asset)
_audioPlayer.setUrl('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3');
// Listen for playback events
_audioPlayer.playbackEventStream.listen((event) {
// Handle playback events, e.g., updating UI
print('Playback event: $event');
});
// Initialize media session
_mediaSessionHandler.init();
}
@override
void dispose() {
_audioPlayer.dispose();
_mediaSessionHandler.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Audio Player'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
// Play or pause audio
if (_audioPlayer.playing) {
await _audioPlayer.pause();
} else {
await _audioPlayer.play();
}
},
child: Text(_audioPlayer.playing ? 'Pause' : 'Play'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
// Stop audio
await _audioPlayer.stop();
},
child: Text('Stop'),
),
],
),
),
);
}
}
解释
-
依赖安装:
- 在
pubspec.yaml
中添加just_audio
和just_audio_media_kit
依赖。
- 在
-
初始化:
- 创建一个
AudioPlayer
实例。 - 创建一个
MediaSessionHandler
实例,并配置Android和iOS的媒体会话(可选)。
- 创建一个
-
加载音频:
- 使用
setUrl
方法加载音频文件(可以是网络URL或本地资源)。
- 使用
-
事件监听:
- 监听
AudioPlayer
的playbackEventStream
以处理播放事件,例如更新UI。
- 监听
-
媒体会话初始化:
- 调用
_mediaSessionHandler.init()
初始化媒体会话。
- 调用
-
播放控制:
- 创建简单的播放、暂停和停止按钮,并绑定到相应的
AudioPlayer
方法。
- 创建简单的播放、暂停和停止按钮,并绑定到相应的
这个示例展示了如何使用just_audio
和just_audio_media_kit
进行基本的音频播放和控制。你可以根据需要进一步扩展功能,例如处理更多媒体会话事件、显示通知等。