Как использовать gstreamer для перекодирования и изменения размера с mp4 (h264/aac) в mp4 (h264/mp3)?

Я хочу перекодировать и изменить размер mp4 (mp4-h264_1920x1080/aac => mp4-h264_640x480/mp3) с помощью gstreamer. Я записал эту команду.

$ gst-launch-0.10 filesrc location=./gain_1.mp4 ! qtdemux name=demux demux.video_00 ! queue ! ffdec_h264 ! videoscale ! 'video/x-raw-yuv,width=640,height=480' ! x264enc ! queue ! qtmux name=mux mux.video_0 demux.audio_00 ! queue ! ffdec_aac ! lame bitrate=128 ! queue ! mux.audio_0 mux. ! filesink location=0000.mp4 –v -e
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
^CCaught interrupt -- handling interrupt.
Interrupt: Stopping pipeline ...

(gst-launch-0.10:17958): GLib-CRITICAL **: Source ID 1 was not found when attempting to remove it
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...

что не сработало.

Транскодирование только видео работает:

gst-launch-0.10 filesrc location=./gain_1.mp4 ! qtdemux name=demux demux.video_00 ! queue ! ffdec_h264 ! videoscale ! 'video/x-raw-yuv, width=640, height=480' ! x264enc ! queue ! mux. mp4mux name=mux ! filesink location=0000.mp4 –v -e

И транскодирование только аудио тоже:

gst-launch-0.10 filesrc location=./gain_1.mp4 ! qtdemux name=demux demux.audio_00 ! ffdec_aac ! lame bitrate=128 ! queue ! mux. mp4mux name=mux ! filesink location=0000.mp4 –v -e

Как я могу перекодировать аудио и видео с помощью одной и той же команды?


person Lionel.J    schedule 20.01.2015    source источник
comment
Какова была ваша точная проблема с первой командой?   -  person Mathieu_Du    schedule 20.01.2015
comment
@Mathieu_Du Сообщение следующее, когда меня заставили запустить эту команду. =› Установка конвейера на PAUSED... Конвейер ПРЕДВАРИТЕЛЬНО ВЫПОЛНЯЕТСЯ... Задержка перераспределения... И только что закончилась.   -  person Lionel.J    schedule 20.01.2015
comment
Попробуйте поставить очередь сразу после звуковой панели демультиплексора, может быть, перед ffdec_aac?   -  person Mathieu_Du    schedule 20.01.2015
comment
@Mathieu_Du Я пытался поставить очередь. вот так ~~~ x264enc! очередь ! мультиплекс демультиплексор.аудио_00 ! очередь ! ffdec_aac ! lame ~~~~ Но результат тот же.   -  person Lionel.J    schedule 20.01.2015
comment
Ну, я не уверен, что там происходит, вы должны попробовать это с gstreamer 1.0, и если вы все еще воспроизводите, приходите обсудить это на gtsreamer IRC.   -  person Mathieu_Du    schedule 20.01.2015


Ответы (2)


@ Lionel.J Я хотел бы предложить два улучшения:

  1. если возможно, используйте gstreamer-1
  2. ваше решение дважды читает исходный файл. Это не обязательно. Кроме того, при этом аудио- и видеопотоки не синхронизируются. Вы можете читать как аудио, так и видеопотоки из qtdemux.

Это конвейер, который работает с gstreamer-1 и читает исходный код только один раз:

gst-launch-1.0 -e filesrc location=/path/to/big_buck_bunny_720p_h264.mov ! \
decodebin name=decode ! \
videoscale ! 'video/x-raw,width=640,height=480' ! \
x264enc ! queue ! mp4mux name=mp4mux ! filesink location=0000.mp4 \
decode. ! audioconvert ! lamemp3enc bitrate=128 ! queue ! mp4mux.
person Adrian W    schedule 19.03.2016
comment
Это дает мне: (gst-launch-1.0:5692): GStreamer-CRITICAL **: gst_element_make_from_uri: утверждение 'gst_uri_is_valid (uri)' не удалось ПРЕДУПРЕЖДЕНИЕ: ошибочный конвейер: синтаксическая ошибка - person mabg; 12.04.2016
comment
@mabg Конвейер должен работать, как показано. Возможно, вам не хватает плагина. Попробуйте запустить с -v, чтобы узнать, что происходит. export GST_DEBUG_DUMP_DOT_DIR=/tmp перед запуском конвейера приведет к тому, что gst-launch в разное время будет создавать дамп конвейера. Это тоже может помочь. Чтобы преобразовать дамп в картинку, запустите dot -Tpng -o pipeline.png /tmp/one-of-the-files.dot. - person Adrian W; 13.04.2016
comment
Проблема в 'видео/x-rax,width=... Если поставить без ', вроде работает, т.к. возникает другая проблема, нет элемента x264enc, но ничего о синтаксической ошибке - person mabg; 14.04.2016
comment
x264enc является частью GStreamer Ugly Plugins. Возможно, вам нужно установить его отдельно (пакет gstreamer1.0-plugins-ugly в Debian-подобных Linux). - person Adrian W; 15.04.2016

О~ Я решил эту проблему. Следующая команда сработала хорошо.

gst-launch-0.10 ffmux_mp4 name=mux ! \
filesink location=0000.mp4 \
filesrc location=./gain_1.mp4 ! qtdemux name=vdemux vdemux.video_00 ! queue ! ffdec_h264 ! videoscale ! 'video/x-raw-yuv, width=640, height=480' ! x264enc ! queue ! mux. \
filesrc location=./gain_1.mp4 ! qtdemux name=ademux ademux.audio_00 ! ffdec_aac ! lame bitrate=128 ! queue ! mux.`
person Lionel.J    schedule 27.01.2015