使用(Python) Gstreamer解码音频(为PCM数据)
我正在写一个应用程序,使用Python的Gstreamer库来播放音频,但现在我想要做的是解码音频。也就是说,我想用一个叫做 decodebin
的东西来读取数据,并得到一个原始的PCM数据块。具体来说,我希望能够逐块读取文件,而不是一次性把整个文件都加载到内存里。
我有一些具体的问题:我该如何用Gstreamer来实现这个?特别是用pygst的话?我需要使用特定的“sink”元素来从流中读取数据吗?有没有推荐的方式来读取 pygst Buffer
对象 中的数据?我该如何控制我消费数据的速度(而不是单纯地进入一个“主循环”)?
1 个回答
5
要在你的应用程序中获取数据,推荐使用appsink。
假设你有一个简单的音频播放器,比如这个,你可以把里面的oggdemux和vorbisdec替换成decodebin和capsfilter,并设置caps为“audio/x-raw-int”。接着,把autoaudiosink改成appsink,并将“new-buffer”信号连接到一个Python函数,同时把“emit-signals”设置为True。这样,函数就能接收到解码后的PCM/int数据块。解码的速度取决于你能多快解码和处理这些数据。由于new-buffer信号是在Gstreamer的线程上下文中,你可以在那个函数里使用sleep或wait来控制或减慢解码的速度。