Android OpenSLES Buffer Starvation问题

时间:2014-01-09 14:16:07

标签: android opensl

我正在尝试解决Android OpenSLES中的以下问题。

OpenSLES规范说明如下:

  

http://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf    - 8.12

     

当玩家处于SL_PLAYSTATE_PLAYING状态时,即   由SLPlayItf接口控制[见第8.32节],添加   缓冲区将隐式开始播放。在饥饿到期的情况下   如果队列中的缓冲区不足,则停止播放音频数据。   播放器仍处于SL_PLAYSTATE_PLAYING状态。排队时   额外的缓冲区,音频数据的播放恢复。注意   排队缓冲区的饥饿导致音频数据中的可听间隙   流。在玩家未处于游戏状态的情况下,   添加缓冲区不会启动音频播放。

唉,有一次我们到了android:

  

http://mobilepearls.com/labs/native-android-api/ndk/docs/opensles/index.html    - 将音频解码为PCM

     

根据平台实现,可能需要解码   不能闲置的资源。因此不建议这样做   由于未能提供足够数量的空,所以使解码器饿死   PCM缓冲器,例如通过从Android简单缓冲队列返回   回调而不排队另一个空缓冲区。的结果   解码器饥饿未指定;实施可能会选择   丢弃解码的PCM数据,暂停解码过程,或者   严重的情况会终止解码器。

这种非规范行为已经彻底阻止了我的项目进展,我迷失了最好的解决方法。将整个文件解码为内存或磁盘上的pcm不是一种选择,我真的需要将其作为流媒体解决方案。任何有关这方面的帮助都将受到大力赞赏

1 个答案:

答案 0 :(得分:0)

似乎没有解决这个问题的方法。其他项目似乎使用较低级别的apis(例如libstagefright)进行解码。该方法可以让您获得数据

[编辑] 围绕饥饿问题没有办法解决。 Android只是不遵守规范。基本上你需要缓冲到内存中,并确保在需要控制数据流时使用暂停和恢复解码。

This is a discussion on the subject in the ndk google group