Michaël
Michaël

Reputation: 530

gstreamer: Demux & Remux MKV, preserving video

I am trying to reencode the audio part of a MKV file that contains some video/x-h264 and some audio/x-raw. I can't manage to just demux the MKV and remux it. Even simply:

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

fails miserably with:

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

My best attempt at the transcoding mentioned above goes:

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.   

with the same result. Removing the pad name audio_00 leads to gst being stuck at PREROLLING.

I have seen a few people facing similar problems:

As therein, keeping only video or only audio works.

Upvotes: 0

Views: 4824

Answers (2)

Michaël
Michaël

Reputation: 530

The problem is that the pads video_00 and audio_00 have been renamed video_0 and audio_0. This can be seen using gst-inspect-1.0 matroskademux, which indicates that the format for the pads now reads video_%u. Note that some documentation pages of gstreamer are not updated to reflect that.

The first command, MKV to MKV should read:

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

(Note the added queues)

The second command, MKV to MKV reencoding audio should read:

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.

The same result could have been achieved by not specifying the pads and using cap filters if needed.

Thanks go to user Florian Zwoch for providing a working pipeline.

Upvotes: 0

Florian Zwoch
Florian Zwoch

Reputation: 7383

I think the rawaudioparse should not be here. I tried your pipeline and trouble with it too. I just came up with something as I would have done it and it seemed to work:

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

Audio in my case was:

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

Another format may require addiitonal transformations..

Upvotes: 2

Related Questions