Flutter Audioplayers:iOS/macOS端如何播放字节数据?
Flutter iOS/macOS 播放Amazon Polly字节数据解决方案
方案一:基于audioplayers通过临时文件播放
由于BytesSource仅支持Android,iOS/macOS端可将Polly返回的字节数据写入临时本地文件,再通过UrlSource播放:
写入字节数据到临时文件
借助path_provider包获取系统临时目录,创建临时音频文件并写入数据:import 'dart:io'; import 'package:path_provider/path_provider.dart'; Future<String> writeAudioBytesToTempFile(Uint8List audioBytes) async { final tempDir = await getTemporaryDirectory(); final tempFile = File('${tempDir.path}/polly_temp_audio.mp3'); await tempFile.writeAsBytes(audioBytes); return tempFile.path; }播放临时文件
拿到临时文件路径后,用UrlSource加载并播放,播放完成后删除临时文件释放空间:final audioBytes = await getPollyAudioBytes(); // 替换为你的Polly字节数据获取逻辑 final filePath = await writeAudioBytesToTempFile(audioBytes); final player = AudioPlayer(); await player.play(UrlSource(filePath)); // 播放完成后清理临时文件 player.onPlayerComplete.listen((_) { final tempFile = File(filePath); if (tempFile.existsSync()) { tempFile.deleteSync(); } });
方案二:换用just_audio直接播放字节数据
若不想处理临时文件,推荐使用just_audio包,它的BytesAudioSource支持跨平台直接播放字节数据,无需额外转换:
添加依赖
在pubspec.yaml中引入最新版本的just_audio:dependencies: just_audio: ^0.9.36 # 请替换为最新版本直接播放字节数据
无需文件操作,直接传入Polly返回的字节数据即可:import 'package:just_audio/just_audio.dart'; final audioBytes = await getPollyAudioBytes(); // 替换为你的Polly字节数据获取逻辑 final player = AudioPlayer(); await player.setAudioSource(BytesAudioSource(audioBytes)); await player.play();
方案选择
- 若想继续使用
audioplayers,方案一可满足需求,但需额外处理临时文件的创建与删除; - 方案二更简洁高效,跨平台支持更完善,是优先推荐的替代方案。
内容的提问来源于stack exchange,提问作者Harsh Vardhan
相关产品推荐
相关产品推荐

