ios - 颤振音频播放器播放声音在IOS中不起作用
问题描述
我正在使用颤振插件音频播放器:^0.7.8,以下代码在 Android 中运行,但在 IOS 中不运行。我在真实的 ios 设备中运行代码并单击按钮。它假设播放 mp3 文件,但根本没有声音。请帮助解决这个问题。
我已经设置了 info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
这里是从控制台打印出来的:
- 颤振:加载完毕,uri=file:///var/mobile/Containers/Data/Application/E3A576E2-0F21-44CF-AF99-319D539767D0/Library/Caches/demo.mp3
- 正在将文件同步到设备 iPhone...
- 颤振:_platformCallHandler 调用 audio.onCurrentPosition {playerId:273e1d27-b6e8-4516-bb3f-967a41dff308,值:0}
- 颤振:_platformCallHandler 调用 audio.onError {playerId:273e1d27-b6e8-4516-bb3f-967a41dff308,值:AVPlayerItemStatus.failed}
这里有我的代码:
class _MyHomePageState extends State<MyHomePage> {
AudioPlayer audioPlugin = AudioPlayer();
String mp3Uri;
@override
void initState() {
AudioPlayer.logEnabled = true;
_load();
}
Future<Null> _load() async {
final ByteData data = await rootBundle.load('assets/demo.mp3');
Directory tempDir = await getTemporaryDirectory();
File tempFile = File('${tempDir.path}/demo.mp3');
await tempFile.writeAsBytes(data.buffer.asUint8List(), flush: true);
mp3Uri = tempFile.uri.toString();
print('finished loading, uri=$mp3Uri');
}
void _playSound() {
if (mp3Uri != null) {
audioPlugin.play(mp3Uri, isLocal: true,
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Audio Player Demo Home Page'),
),
body: Center(),
floatingActionButton: FloatingActionButton(
onPressed: _playSound,
tooltip: 'Play',
child: const Icon(Icons.play_arrow),
),
);
}
}
解决方案
如果要使用本地文件,则必须使用AudioCache
.
查看文档,它在底部说:
音频缓存
为了播放本地资产,您必须使用 AudioCache 类。
Flutter 并没有提供在资产上播放音频的简单方法,但是这个类有很大帮助。它实际上将资产复制到设备中的临时文件夹,然后作为本地文件播放。
它可以用作缓存,因为它会跟踪复制的文件,以便您可以立即重播。
要播放音频,这就是我想出的我们需要做的事情:
import 'package:flutter/material.dart';
import 'package:audioplayers/audio_cache.dart';
AudioCache audioPlayer = AudioCache();
void main() {
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
@override _MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override initState(){
super.initState();
audioPlayer.play("Jingle_Bells.mp3");
}
@override Widget build(BuildContext context) {
//This we do not care about
}
}
重要的:
它会自动将“assets/”放在您的路径前面。这意味着如果你想加载assets/Jingle_Bells.mp3
,你只需把audioPlayer.play("Jingle_Bells.mp3");
. 如果您audioPlayer.play("assets/Jingle_Bells.mp3");
改为输入,则实际上会加载 AudioPlayers assets/assets/Jingle_Bells.mp3
。
``
推荐阅读
- django - Django - 模板 - 检查字段是否具有属性
- python-3.x - Pubsub API Explorer:返回的消息数据不正确
- wordpress - Wp Cron 作业 - 错误
- mysql - where 子句 laravel 中的内部查询
- java - 'springSecurityFilterChain' 抛出 java.lang.NullPointerException
- magento - Magento 2.1.9 - 无法访问 Magento API 日志文件。Magento 日志文件中提供了详细信息。报告 ID:webapi-5b7e549729324
- c# - 将方法绑定到 ViewCell Tapped
- java - 在 bash 脚本中运行 jar 无法创建文件,但如果我在终端上运行 jar,它会正常创建文件
- firebase - Firebase:所有孩子的数据快照期望一个
- html - 如何在我的任何文章上放置指向我网页中其他文章的不同链接