此问题与How to add subtitles from a SRT file on a video and play it with Gstreamer in a c program
有关我想在SRT文件中叠加带有字幕的MP4视频。
在我看来,这个过程需要两个线程:一个用于读取和解码MP4文件,另一个用于读取和解析字幕。然后他们需要以某种方式组合,这就是我认为元素subtitleoverlay
的用途。最后,我想查看结果。 (当这工作时,我将在Python中重新编写它并将其安装在Web服务器后面,该服务器将覆盖带有自定义字幕的视频内容并传输结果。)
这是我的第一次尝试:
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 :(得分: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没有输入,因此发出错误。
'!' character表示连接了两个元素,但如果元素之间有空格,则只表示创建新元素而不将其连接到前一个元素。关于工作流水线的另一个要点是,可以并且有必要设置元素的名称,以便稍后在管道中使用它。
答案 1 :(得分:0)
我通过研究http://docs.gstreamer.com/display/GstSDK/gst-launch上的textoverlay示例找到了一个解决方案:
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都没有这个名字的垫。我想我不完全理解管道语法。
答案 2 :(得分:0)
格式化管道的更好方法是:
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
这表明filesource是一个单独的元素,而不是ov.videosink和ov_text_sink的一部分。