【问题标题】:AudioTrack: how to detect end of sound?AudioTrack:如何检测声音的结束?
【发布时间】:2011-10-04 02:26:45
【问题描述】:

我正在使用 AudioTrack 在 Android 上播放 PCM WAV 声音文件(另请参阅 here)。流模式,工作线程。我想知道如何检测声音的结束,以便释放和释放AudioTrackwrite() 调用似乎是阻塞的——但它会阻塞直到所提供数据的播放完成吗?不太确定。

是我,还是这门课上的文档严重不足?如果你碰巧有一个指向AudioTrack 的非官方指南的链接,我很乐意看到。

【问题讨论】:

标签: android audio audiotrack


【解决方案1】:

根据我的经验,AudioTrack.write() 调用确实会阻塞,直到数据写入硬件的音频缓冲区。

所以在write() 结束后,音频是保证播放的。基本上效果不错。

要更准确地检测音频结束,请使用AudioTrack.setNotificationMarkerPosition()AudioTrack.setPlaybackPositionUpdateListener()。注意setNotificationMarkerPosition() 计算音频样本(不是字节),因此如果您的音频是 16 位样本,则位置将为 dataSize/2。

我的项目中有一个例子: https://github.com/mine260309/android-sexypsf-player/blob/psf2/src/com/mine/psf/sexypsf/MineSexyPsfPlayer.java

【讨论】:

  • 在大多数简单的情况下,你肯定是对的,但你的陈述是错误的。 write() 并不总是保证它会播放它得到的东西。请参阅下一条评论。
  • 阅读文档:在流模式下,阻塞行为取决于写入模式。如果写入模式为 WRITE_BLOCKING,则写入通常会阻塞,直到所有数据都已排队等待播放,并将返回完整的传输计数。但是,如果写模式是WRITE_NON_BLOCKING,或者track在进入时被停止或者暂停,或者另一个线程调用stop或者pause中断了写,或者写过程中发生了I/O错误,那么写可能会返回一个short transfer数。
  • “所以如果你的音频是 16 位样本,位置将是 dataSize/2”的声明也不精确,这取决于不止一件事。每个通道的通道数和每个数据的字节数。而且这种简单的计算仅适用于线性未压缩音频,例如 PCM,请参阅 AudioFormat#getBytesPerSample()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多