【问题标题】:AVAudioPlayer cannot be initialized无法初始化 AVAudioPlayer
【发布时间】:2017-09-11 11:44:20
【问题描述】:

在 Xamarin.iOS 应用程序中,AVAudioPlayer 用于录制和播放一些音频文件。

用户非常快速地录制和保存一些音频文件,当他尝试播放其中一个文件时,它会在行中抛出 System.Exception:

NSError error;
_player = new AVAudioPlayer(NSUrl.FromFilename(_audioPlaybackFilePath), "m4a", out error);

System.Exception:无法初始化该类型的实例 'AVFoundation.AVAudioPlayer':本机 'initWithContentsOfURL:fileTypeHint:error:' 方法返回 nil。这是 可以通过设置忽略此条件 MonoTouch.ObjCRuntime.Class.ThrowOnInitFailure 为 false。

给定路径中的文件存在。

  1. 有任何迹象表明问题可能是什么?
  2. 有什么方法可以将 MonoTouch.ObjCRuntime.Class.ThrowOnInitFailure 设置为 false,因为它在 Exception StackTrace 中声明?

【问题讨论】:

  • method returned nil :您的NSUrl 没有返回可用于创建AVAudioPlayer的有效文件
  • 问题是文件存在(File.Exists 使用给定的路径返回 true。很少返回 false!)。那么我应该将AVAudioPlayer 的初始化包装到try catch 中吗?有没有办法在我初始化AVAudioPlayer之前验证文件是否有效?
  • 以某种方式是的......如果文件仍然被刷新到“磁盘”并被 Mono 关闭,因此被 iOS 关闭(无论这是由于多线程用户代码还是通过 iOS)并且你正在尝试打开它(通过 AVAudioPlayer),错误是有道理的。您可以引入一些重试逻辑来检查文件是否存在,如果存在,请检查它不是零字节并且可以在排他锁中打开,等等......在使用AVAudioPlayer.FromUrl之前。
  • 我个人会使用AVAudioPlayer.FromData,就好像你要做文件存在检查、大小检查和负载锁定测试一样,你不妨使用数据(NSData)来创建你的AVAudioPlayer实例
  • 你试过_player = new AVAudioPlayer(new NSUrl(_audioPlaybackFilePath), "m4a", out error);吗?

标签: c# ios xamarin xamarin.ios avaudioplayer


【解决方案1】:

正如@SushilHangover 指出的那样,使用 AVAudioPlayer.FromData 并使用如下流提供它:

    theStream.Position = 0;
    AVAudioPlayer.FromData(NSData.FromStream(theStream));

而且,这很重要,流一直定位到 0。

【讨论】:

    【解决方案2】:

    我们使用包Plugin.AudioRecorder 得到了这个错误,它使用了AVAudioPlayer。我们可以通过将以下代码添加到FinishedLaunching 来修复它:

    AudioPlayer.OnPrepareAudioSession = audioSession =>
    {
        // maybe force audio to route to the speaker?
        var success = audioSession.OverrideOutputAudioPort (AVAudioSessionPortOverride.Speaker, out NSError error);
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2020-01-22
      相关资源
      最近更新 更多