【问题标题】:flutter audio player play sound not working in IOS颤振音频播放器播放声音在IOS中不起作用
【发布时间】:2019-03-18 22:20:57
【问题描述】:

我正在使用颤振插件audioplayers: ^0.7.8, 以下代码在Android 中运行,但在IOS 中不运行。我在真实的 ios 设备中运行代码并单击按钮。它假设播放 mp3 文件,但根本没有声音。请帮忙解决这个问题。

我已经设置了 info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

从控制台打印出来:

  • flutter:加载完毕,uri=file:///var/mobile/Containers/Data/Application/E3A576E2-0F21-44CF-AF99-319D539767D0/Library/Caches/demo.mp3
  • 正在将文件同步到设备 iPhone...
  • flutter:_platformCallHandler 调用 audio.onCurrentPosition {playerId:273e1d27-b6e8-4516-bb3f-967a41dff308,值:0}
  • flutter:_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),
      ),
    );
  }
}

【问题讨论】:

  • audioPlugin.play()方法中添加volume参数,结果是什么。它是 0.0 和 1.0 之间的双精度值。
  • 同理,IOS不行。

标签: ios flutter audio-player


【解决方案1】:

如果你想使用本地文件,你必须使用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

``

【讨论】:

  • 谢谢,我使用了您的代码并听到了声音,但屏幕崩溃并出现以下错误:在构建 MyApp(state: _MyAppState#a5271): MediaQuery.of() 时引发了以下断言不包含 MediaQuery 的上下文。从传递给 MediaQuery.of() 的上下文开始,找不到 MediaQuery 祖先。
  • @GPH 由于您的小部件的布局方式,现在这是一个不同的问题。您最好的选择是对整个显示代码提出一个新问题,以便我们了解正在发生的事情。请随时在此处发布新问题的链接,以便我为您提供帮助。还记得投票并接受这个答案。
  • 感谢您的帮助!我确实需要你的帮助来打印颤振。请看这个问题stackoverflow.com/questions/52903682/…
  • @GPH 这看起来不像 MediaQuery.of() 错误的来源。
  • 如果文件不在iOS本地资产中,可以播放吗?
猜你喜欢
  • 1970-01-01
  • 2020-11-02
  • 2022-08-21
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
相关资源
最近更新 更多