gstreamer: Demux & Remux MKV, с сохранением видео - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь перекодировать звуковую часть файла MKV, который содержит некоторые video/x-h264 и некоторые audio/x-raw. Я не могу просто демультиплексировать MKV и сделать его повторно. Даже просто:

gst-launch-1.0 filesrc location=test.mkv ! matroskademux name=demux \
    matroskamux name=mux ! filesink location=test2.mkv \
    demux.video_00 ! mux.video_00 \
    demux.audio_00 ! mux.audio_00

терпит неудачу с:

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
WARNING: from element /GstPipeline:pipeline0/GstMatroskaDemux:demux: Delayed linking failed.
Additional debug info:
../gstreamer/gst/parse/grammar.y(506): gst_parse_no_more_pads (): /GstPipeline:pipeline0/GstMatroskaDemux:demux:
failed delayed linking pad  video_00 of GstMatroskaDemux named demux to pad  video_00 of GstMatroskaMux named mux
WARNING: from element /GstPipeline:pipeline0/GstMatroskaDemux:demux: Delayed linking failed.
Additional debug info:
../gstreamer/gst/parse/grammar.y(506): gst_parse_no_more_pads (): /GstPipeline:pipeline0/GstMatroskaDemux:demux:
failed delayed linking pad  audio_00 of GstMatroskaDemux named demux to pad  audio_00 of GstMatroskaMux named mux
ERROR: from element /GstPipeline:pipeline0/GstMatroskaDemux:demux: Internal data stream error.
Additional debug info:
../gst-plugins-good/gst/matroska/matroska-demux.c(5715): gst_matroska_demux_loop (): /GstPipeline:pipeline0/GstMatroskaDemux:demux:
streaming stopped, reason not-linked (-1)
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...

Моя лучшая попытка перекодирования, упомянутая выше, выглядит так:

gst-launch-1.0 -v filesrc location=test.mkv ! matroskademux name=demux \
   matroskamux name=mux ! filesink location=test2.mkv \
   demux.video_00 ! queue ! 'video/x-h264' ! h264parse ! mux. \
   demux.audio_00 ! queue ! rawaudioparse ! audioconvert ! audioresample ! avenc_aac ! mux.   

с тем же результатом. Удаление названия пэда audio_00 приводит к тому, что gst застревает на PREROLLING.

Я видел, как несколько человек сталкивались с подобными проблемами:

Как и в нем, работает сохранение только видео или только звука.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я думаю, что rawaudioparse здесь быть не должно. Я пробовал ваш пайплайн и тоже с ним проблемы Я просто придумал что-то, как я бы это сделал, и, похоже, это сработало:

filesrc location=test.mkv ! matroskademux \
  matroskademux0. ! queue ! audioconvert ! avenc_aac ! matroskamux ! filesink location=test2.mkv \
  matroskademux0. ! queue ! h264parse ! matroskamux0.

Аудио в моем случае было:

Stream #0:0(eng): Audio: pcm_f32le, 44100 Hz, 2 channels, flt, 2822 kb/s (default)

Другой формат может потребовать дополнительных преобразований ..

0 голосов
/ 05 мая 2020

Проблема в том, что колодки video_00 и audio_00 были переименованы в video_0 и audio_0. Это можно увидеть с помощью gst-inspect-1.0 matroskademux, что означает, что формат для контактных площадок теперь читается как video_%u. Обратите внимание, что некоторые страницы документации gstreamer не обновлены, чтобы отразить это.

Первая команда, MKV в MKV должна читать:

gst-launch-1.0 filesrc location=test.mkv ! matroskademux name=demux \
    matroskamux name=mux ! filesink location=test2.mkv \
    demux.video_0 ! queue ! mux.video_0 \
    demux.audio_0 ! queue ! mux.audio_0

(Обратите внимание на добавленное queue s)

Вторая команда, перекодирование аудио из MKV в MKV, должна выглядеть так:

gst-launch-1.0 -v filesrc location=test.mkv ! matroskademux name=demux \
   matroskamux name=mux ! filesink location=test2.mkv \
   demux.video_0 ! queue ! 'video/x-h264' ! h264parse ! mux. \
   demux.audio_0 ! queue ! rawaudioparse ! audioconvert ! audioresample ! avenc_aac ! mux.

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

Спасибо go пользователю Флориану Цвочу за предоставленный рабочий конвейер.

...