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