【问题标题】:Android AudioTrack only plays first 2 seconds back, then stopsAndroid AudioTrack 只播放前 2 秒,然后停止
【发布时间】:2011-11-15 22:30:07
【问题描述】:

我正在为 AudioTrack 使用一个额外的线程来播放我之前在另一个活动中录制的波形文件。

当我开始播放时,我在 LogCat 中得到以下输出:

09-13 09:13:13.207: WARN/Archive(1066): audioplayThread is running..., state is: READY
09-13 09:13:21.187: WARN/Archive(1066): wave file /mnt/sdcard/myrecording/myrecording_3_12-09-2011_14-14.wav
09-13 09:13:22.582: WARN/Archive(1066): audioPlayer bufferSize 4090
09-13 09:13:22.582: WARN/Archive(1066): audioPlayer wave length 206432
09-13 09:13:22.601: DEBUG/AudioHardware(75): AudioHardware pcm playback is exiting standby.
09-13 09:13:22.601: DEBUG/AudioHardware(75): openPcmOut_l() mPcmOpenCnt: 0
09-13 09:13:22.683: WARN/AudioFlinger(75): write blocked for 82 msecs, 1 delayed writes, thread 0xcb08
09-13 09:13:24.816: WARN/Archive(1066): playbackHeadposition is: 49591
09-13 09:13:24.816: WARN/Archive(1066): audiostate is: 3
09-13 09:13:26.089: WARN/AudioTrack(1066): obtainBuffer() track 0x298b18 disabled, restarting
09-13 09:13:27.214: WARN/AudioTrack(1066): obtainBuffer() track 0x298b18 disabled, restarting
09-13 09:13:28.332: WARN/AudioTrack(1066): obtainBuffer() track 0x298b18 disabled, restarting
09-13 09:13:29.457: WARN/AudioTrack(1066): obtainBuffer() track 0x298b18 disabled, restarting

...

【问题讨论】:

  • 你还没有问过问题。
  • 这需要更多信息。您的 AudioTrack 设置为哪种模式播放,STREAM 或 STATIC?如果它在 STREAM 中,您是否有一个正在写入更多数据的线程?声音数据整体有多大?

标签: android audio buffer delay


【解决方案1】:

我刚刚看到 logcat: gainBuffer() track 0x298b18 disabled, restarting .. 也就是说:您没有获得音频数据并且输入音频流已停止。因此缓冲区必须等待音频流进入。我认为您应该检查输入流和读取方法。您必须确保您已连续读取音频数据。

【讨论】:

  • 感谢您的回复。在尝试了很多不同的参数并阅读了 stackoverflow 上的几乎每个音频线程之后,我最终选择不使用 AudioTrack。早期的 AudioTrack 代码有效,但后来却没有。这让我觉得 AudioTrack 类并不那么可靠。最后,我使用 MediaPlayer 进行音频播放。也许它有更多的开销,但它是可靠的。
  • 我不会说它不可靠,但您必须更加小心使用 AudioTrack。
  • AudioTrack 不适合胆小的人。很容易将字节馈入其中,从而导致您遇到错误。我也没有想出解决这个问题的办法。
【解决方案2】:

我以前也遇到过同样的问题。我使用了与 Android 的媒体播放器对应的 vitamio 捆绑包,它具有更多的音频支持。尝试将此代码添加到您的清单中:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    当写入样本的数量不能被通道数整除时,我观察到了同样的问题。

    例如:

    通道数:2

    mAudioTrack.write(buffer, 0, 75);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2013-02-14
      • 2012-09-15
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      相关资源
      最近更新 更多