Как прочитать размер потока в Gstreamer?

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()

Однако это действительно очень медленно (в 20 раз медленнее, чем просто использование filesink).


person JohnW    schedule 01.01.2016    source источник
comment
В 20 раз медленнее — это много, вы пытались отследить, что именно поглощает все это дополнительное время? Возможно, его можно улучшить.   -  person thiagoss    schedule 02.01.2016


Ответы (1)


Можно попробовать использовать щупы.

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

Добавьте зонд для буферов и списков буферов на контактные площадки, где вы хотите подсчитать количество байтов.

person thiagoss    schedule 02.01.2016
comment
Я бы также предложил рассмотреть возможность использования элементов identity. Я считаю, что их немного легче зацепить, чем пэды, особенно динамически созданные пэды из декобинатора. - person mpr; 04.01.2016