【问题标题】:How to read a stream size in Gstreamer?如何在 Gstreamer 中读取流大小?
【发布时间】:2016-01-01 23:00:54
【问题描述】:

1。上下文

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

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

ENCODER 是任何 gstreamer 编码器和 MUXER,无论是什么合适的复用器。管道正在工作。为简单起见,假设只有一个音频流来自decodebin

2。问题

现在,

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

3。我尝试了什么

我正在使用带有 GI 的 Python。我尝试使用 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 倍)。

【问题讨论】:

  • 慢 20 倍是很多,您是否尝试跟踪究竟是什么消耗了所有额外的时间?也许可以改进。

标签: python audio gstreamer pygobject gobject-introspection


【解决方案1】:

您可以尝试使用焊盘探针。

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

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

【讨论】:

  • 我还建议考虑使用identity 元素。我发现它们比焊盘更容易连接,尤其是从 decodebin 动态创建的焊盘。
猜你喜欢
  • 2021-05-30
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2011-05-04
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多