【问题标题】:AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client due to mismatching sample rateAudioTrack:由于采样率不匹配,客户端拒绝 AUDIO_OUTPUT_FLAG_FAST
【发布时间】:2014-09-03 22:53:17
【问题描述】:

有人知道如何解决这个警告信息吗?

07-14 10:38:55.411 V/tracker-audiotest(22426): Recording Thread::run(): start audioRecord 录制。 07-14 10:45:51.490 “W/AudioTrack(607):AUDIO_OUTPUT_FLAG_FAST 因采样率不匹配而被客户端拒绝(44100 与 48000)”

当我在 Android 4.4 上测试音频延迟时,我在看到此警告消息后遇到了突然增加的延迟。但我在测试过程中没有改变采样率,初始设置为 48kHz。开始录制 7 分钟后会出现此警告消息。

如果需要,您可以在您的设备上测试此项目。项目在 GitHub:

https://github.com/garyyu/OpenSL-ES-Android-DelayTest

【问题讨论】:

    标签: audio real-time low-latency


    【解决方案1】:

    AUDIO_OUTPUT_FLAG_FAST 被拒绝,因为您使用的速率与硬件支持的速率不同。您需要查询硬件支持的采样率并以该速率记录,而不是将其硬编码为 48kHz。

    【讨论】:

      【解决方案2】:

      您可以尝试使用Java函数接口:

      AudioManager myAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);  
      nativeSampleRate = myAudioMgr.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
      

      要检索手机上的硬件默认采样率,请使用它来创建播放器。
      也尝试使用:

      nativeSampleBufSize = myAudioMgr.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
      

      获取默认音频缓冲区大小(以帧为单位)并将其用于播放。

      如果 JNI 适合您,您可以查看 JNI 示例代码 audio-echo

      【讨论】:

      • 我尝试在我的 Android-M(nexus 9 和 nexus 5)上运行您的程序,原始音频文件可以正常播放(我使用了音乐文件,所以任何中断都很明显)。您的缓冲区为 480,在我的设备上,快速音频缓冲区大小为:
      • 240 帧/缓冲区,频率为 48Khz。我觉得播放很流畅。 Android-M 对音频进行了改进,您可以检查一下,看看它最终是否有所改进。
      • 看代码,在内部循环中,它首先拉入录制的音频,写入文件[在比特进入文件之前复制了两次];然后通过读取一个音频数据缓冲区来处理播放器,对其重新采样,复制到播放缓冲区 [2 个副本];然后将它们混合并写入文件。在一个缓冲播放时间内,5个副本,3个文件访问,它们必须按时完成。如果没有完成,播放器或记录器正在挨饿,会导致故障。我认为让播放器和记录器具有双缓冲区并在回调发生时将新缓冲区排入队列可能会更好。也可以大块读取文件。
      【解决方案3】:

      尝试改变采样率

      框架/基础/
      框架/av/
      硬件/库硬件

      位置。

      默认采样率为 44100 尝试设置您想要的采样率(您的音频文件有)。它会起作用的。

      干杯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 2016-10-10
        • 1970-01-01
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多