2016-08-21 2 views
0

Этот вопрос связан с How to add subtitles from a SRT file on a video and play it with Gstreamer in a c programКак использовать GStreamer для наложения видео с субтитрами

Я хочу наложить MP4 видео с субтитрами из файла SRT.

Мне кажется, что для этого процесса требуются два потока: один для чтения и декодирования файла MP4, а другой для чтения и анализа субтитров. Затем их нужно каким-то образом скомбинировать, и это то, что я считаю элементом subtitleoverlay. Наконец, я хочу просмотреть результат. (Когда это работает, я вновь пишу это в Python и установить его за веб-сервер, который будет и наложения видео контента с пользовательскими субтитров и поток результат.)

Вот моя первая попытка:

gst-launch-1.0 -v \ 
    filesrc location=titles.srt \ 
    ! subparse name=txt \ 
    ! queue \ 
    ! filesrc location=sample.mp4 \ 
    ! decodebin \ 
    ! subtitleoverlay \ 
    ! autovideosink 

Это печатает:

WARNING: erroneous pipeline: could not link queue0 to filesrc1 

Я ветеран программист, но полный новичок в обработке видео-потока. Я потратил несколько часов на обработку документов в http://docs.gstreamer.com/ и искал примеры, но я, очевидно, все еще не понимаю, как собрать потоки. Я не пытался копировать пример из предыдущего вопроса, потому что я все еще не понимаю все это, и я хочу начать с чего-то основного, что я могу добавить по мере необходимости.

ответ

0

Я нашел решение, изучая пример textoverlay на http://docs.gstreamer.com/display/GstSDK/gst-launch:

gst-launch-1.0 -v \ 
    textoverlay name=ov \ 
    ! autovideosink filesrc location=sample.mp4 \ 
    ! decodebin \ 
    ! ov.video_sink filesrc location=titles.srt \ 
    ! subparse \ 
    ! ov.text_sink 

Я до сих пор не понимаю, что «filesrc» делает для autovideosink и textoverlay. filesrc - это отдельный элемент, но здесь он используется так, как будто это имя пэда. Ни autovideosink, ни textoverlay не имеют подписи под этим именем. Наверное, я не совсем понимаю синтаксис конвейера.

1

Пример трубопровода имеет нечетные разрывы строк. Вот такой же трубопровод с лучшим форматированием (на мой взгляд), но некоторым людям нравится выстраивать в линию все '!' персонажи.

Данные из 2 источников файлов фильтруются в исходные колодки элементов textoverlay. Все линейные тормоза игнорируются.

gst-launch-1.0 -v \ 
    textoverlay name=ov ! autovideosink \ 
    filesrc location=sample.mp4 ! decodebin ! ov.videosink \ 
    filesrc location=titles.srt ! subparse ! ov.text_sink 

Одной из проблем в оригинальном трубопроводе является то, что он пытается соединить выход очереди на вход второго filesrc. Но filesrc не имеет ввода, поэтому выдается ошибка.

The '!' символ указывает на то, что два элемента связаны, но если между элементами есть пробел, это означает, что создается новый элемент без его подключения к предыдущему элементу. Еще одна вещь, указывающая на рабочий конвейер, заключается в том, что возможно и необходимо установить имя элемента, чтобы его можно было использовать позже в конвейере.

Смежные вопросы