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

Posted

技术标签:

【中文标题】使用 (Python) Gstreamer 解码音频(到 PCM 数据)【英文标题】:Use (Python) Gstreamer to decode audio (to PCM data) 【发布时间】:2010-08-17 23:23:39 【问题描述】:

我正在编写一个使用 Python Gstreamer 绑定来播放音频的应用程序,但我现在也尝试解码音频——也就是说,我想使用 decodebin 读取数据并接收原始 PCM 缓冲区。具体来说,我想以增量方式读取文件的块,而不是将整个文件读入内存。

一些具体问题:如何使用 Gstreamer 完成此任务?特别是pygst?我需要使用特定的“接收器”元素从流中读取数据吗?是否有从pygst Buffer object 读取数据的首选方法?如何控制我使用数据的速率(而不是仅仅进入“主循环”)?

【问题讨论】:

更多未来参考:这是我提出的解决方案(在 elmarco 的帮助下),它可能在其他项目中也很有用。 github.com/sampsyo/pylastfp/blob/master/lastfp/gstdec.py 【参考方案1】:

要在您的应用程序中取回数据,推荐的方法是appsink。

基于一个简单的音频播放器,如this one(并将 oggdemux/vorbisdec 替换为 decodebin 和 capsfilter 为 caps = "audio/x-raw-int"),将 autoaudiosink 更改为 appsink,并将 "new-buffer" 信号连接到一个python函数+将“发射信号”设置为True。该函数将接收解码的 PCM/int 数据块。解码速率将取决于您可以解码和消费的速率。由于新缓冲区信号位于 Gstreamer 线程上下文中,因此您可以在该函数中休眠/等待以控制或减慢解码速度。

【讨论】:

谢谢!我不知道appsink。这很有帮助! 尝试此操作后的一个附加说明(供将来参考):您似乎需要将appsink的“同步”属性设置为false,以便尽快获取数据。否则,您将实时使用数据。 一个细节:appsink 的 Python 绑定不绑定 gst_appsink_pull_buffer() 方法;相反,您需要调用 appsink.emit('pull-buffer')。

以上是关于使用 (Python) Gstreamer 解码音频(到 PCM 数据)的主要内容,如果未能解决你的问题,请参考以下文章

在 EOS 上用 Python 重启 GStreamer 管道

使用 gstreamer 和 ffmpeg 进行 H.264 解码

Linux之gstreamer视频编解码测试指令

RIoTBoard开发板系列笔记—— gstreamer + vpu实现视频硬件解码播放

随时随地在 GStreamer 管道中添加和删除音频源

基于kaldi的iOS实时语音识别(本地)+03+音频采集传输