如何在Gstreamer中读取流大小?

时间:2016-01-01 23:00:55

标签: python audio gstreamer pygobject gobject-introspection

1。上下文

我有一个非常简单的管道:

filesrc location=foo.wav ! decodebin ! ENCODER ! MUXER ! filesink location=bar.whatever

ENCODER是任何gstreamer编码器和MUXER,无论适当的多路复用器。管道正在运转。为简单起见,假设只有一个音频流来自decodebin

2。问题

现在,

  • 如何在decodebin之后(即原始PCM大小)查询总音频流大小以字节为单位
  • 如何在ENCODER之后(即原始压缩尺寸)查询总音频流以字节为单位

3。我尝试了什么

我正在使用Python和GI。我已尝试使用appsink元素,但无效,使用以下管道:

filesrc location=foo.wav ! decodebin ! ENCODER ! tee name=tee \
      tee. ! queue ! MUXER ! filesink location=bar.whatever \
      tee. ! queue ! appsink

appsink的相关部分如下:

counter = 0
appsink = Gst.ElementFactory.make('appsink', None)
appsink.set_property('emit-signals', True)
appsink.set_property('sync', False)
appsink.connect('new-sample', on_new_buffer)
appsink.connect('new-preroll', on_new_preroll)

def on_new_buffer(sample):
    counter += sample.emit('pull-sample').get_buffer().get_size() 

def on_new_preroll(sample):
    counter += sample.emit('pull-preroll').get_buffer().get_size()

然而,这真的很慢(比使用filesink慢20倍。)

1 个答案:

答案 0 :(得分:1)

您可以尝试使用垫探针。

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-add-probe

在要计算字节数的焊盘上添加缓冲区和缓冲区列表的焊盘探针。