2016-03-12 4 views
0

Я хотел бы создать несегментированное видео .mp4 из источника matroska. Я видел this post и создал аналогичный трубопровод. Мой источник содержит только h264 видео и звука, поэтому мой трубопровод выглядит следующим образом:Сроки теряются при преобразовании видео h264 в несегментированный mp4 с использованием gstreamer

gst-launch-1.0 filesrc location=x.mkv ! matroskademux ! h264parse ! mp4mux ! filesink location=x.mp4 

Однако работает gst-discoverer-1.0 на результате дает длительность 0: 00: +00,000000000. Также vlc не может воспроизвести полученный файл .mp4 и не может использоваться в элементе HTML5 <video> (что является конечной целью этого преобразования).

Если я создаю сегментированный .mp4, добавив fragment-duration=1000 в элемент mp4mux, то vlc может воспроизводить .mp4, но это не то, что я хочу. Мне нужна .mp4, где известна общая длина. Что я делаю неправильно?

Дополнительная информация: Длина была в источнике matroska, как показано на рисунке gst-discoverer-1.0, и vlc может отображать этот источник. Я также могу воспроизвести несегментированный .mp4 с gstreamer (используя gst-launch-1.0 filesrc location=x.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink). Проверка созданного файла .dot показывает частоту кадров 10000/1, исходящую из qtdemux, которая кажется довольно странной.

ответ

1

Решение было добавить disable-passthrough=true к h264parse элементу, так что трубопровод теперь выглядит следующим образом:

gst-launch-1.0 filesrc location=x.mkv ! \ 
matroskademux ! \ 
h264parse disable-passthrough=true ! \ 
mp4mux ! \ 
filesink location=x.mp4 

Теперь полученный файл .mp4 включает в себя информацию о синхронизации и может хорошо играть с VLC, а также в теге <video>, включая навигацию вперед/назад.