哪个线程用于音频解码?

oli*_*erg 5 audio multithreading decoding audio-streaming

使用音频播放时,我习惯了以下模式:

  • 一个磁盘(或网络)线程,从磁盘(或网络)读取数据并填充一个环形缓冲区
  • 一个音频线程,从ringbuffer读取数据,可能执行DSP,并写入音频硬件(pull或push API)

这很好用,在使用WAV文件时没有问题.

现在,如果源数据以压缩格式编码,如Vorbis或MP3,则解码需要一些时间.

看起来在磁盘/网络线程中执行解码似乎很常见.

但这不是错误的设计吗?在磁盘或网络访问块时,某些CPU时间可用于解码,但如果在同一线程中发生解码则会浪费.

在我看来,如果网络变慢,那么如果按顺序进行解码,则缓冲区欠载的风险会更高.

那么,不应该在音频线程中执行解码吗?

在我的上下文中,我宁愿避免添加专用的解码线程.它适用于移动平台,SMP现在非常罕见.但请告诉我们一个专用的解码线程是否真的对您有意义.

Sam*_*eff 2

音频线程可用于流畅地播放音频比网络线程保持完美大小的缓冲区更重要。如果您只使用两个线程,那么解码应该在网络线程上完成。如果您要在播放线程上进行解码,那么您可能需要将更多音频推送到硬件,但线程正忙于解码。如果您维护已解码音频的缓冲区,那就更好了。

理想情况下,您将使用三个线程。一种用于读取网络,一种用于解码,一种用于播放。在我们处理音频/视频捕获、记录和流媒体的应用程序中,每个流有八个线程(自从我们最近添加了新功能以来,最近从六个线程增加到了)。每个线程拥有自己的功能要容易得多,然后它可以根据传入/传出缓冲区的性能适当地衡量其性能。这也有利于分析和优化。