使用(Python)Gstreamer解码音频(到PCM数据)

adr*_*ian 8 python audio decode pcm gstreamer

我正在编写一个使用Python Gstreamer绑定来播放音频的应用程序,但我现在还试图解码音频 - 也就是说,我想使用a读取数据decodebin并接收原始PCM缓冲区.具体来说,我想逐步读取文件的块,而不是将整个文件读入内存.

一些具体问题:如何通过Gstreamer实现这一目标?特别是pygst?是否需要使用特定的"接收器"元素来从流中读取数据?有没有从pygst Buffer对象读取数据的首选方法?如何控制消耗数据的速率(而不仅仅是输入"主循环")?

elm*_*rco 5

要在应用程序中恢复数据,推荐的方法是appsink.

基于像这样的简单音频播放器(并通过decodebin&capsfilter用caps ="audio/x-raw-int"替换oggdemux/vorbisdec),将autoaudiosink更改为appsink,并将"new-buffer"信号连接到python function +将"emit-signals"设置为True.该函数将接收已解码的PCM/int数据块.解码速率取决于您可以解码和使用的速率.由于新缓冲区信号位于Gstreamer线程上下文中,因此您只需在该函数中休眠/等待即可控制或降低解码速度.

  • 尝试此操作后,还需要注意一个附加说明(供将来参考):似乎您需要将appsink的"sync"属性设置为false,以便尽快获取数据.否则,您将实时使用数据. (2认同)
  • 一个细节:appsink的Python绑定不绑定gst_appsink_pull_buffer()方法; 相反,你需要调用appsink.emit('pull-buffer'). (2认同)