用openAL播放ffmpeg解码的buffer突然加速问题

问题重现

如果你已经研究了一段时间的openAL或者下载过大量openAL相关的代码,那么你应该知道,openAL的播放模式是将一个个unsigned char *格式的数据添加到一个队列中,然后逐步播放。
当用ffmpeg将音频文件解码成一帧帧的数据后,填充到openAL的队列当中。
因为是边解码边播放,而且解码速率远远大于播放速度,因此openAL的队列中会堆积大量的buffer。这也是音频播放到一定时间就突然莫名其妙加速的原因。

问题解决

openAL中有获取到当前队列中堆积buffer数量的方法:
alGetSourcei(outSourceID,AL_BUFFERS_QUEUED,&queued);
在解码病添加到queue中的过程中,获取一下当前队列中buffer数量,当大于200或其他一个不过于大的数时,等待1秒。

if([openALPlayer getQueued]>200){
    sleep(1);
}
[openALPlayer addToQueue:data size:size];

你可能感兴趣的:(iOS)