这个问题与如何在视频上从SRT文件添加字幕并在c程序中使用Gstreamer播放
有关我想用 SRT 文件中的字幕覆盖 MP4 视频。
在我看来,这个过程需要两个线程:一个用于读取和解码 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/ 上的文档并搜索示例,但我显然仍然不了解如何组合流。我没有尝试复制上一个问题中的示例,因为我还没有完全理解它,我想从一些基本的内容开始,我可以根据需要添加这些内容。
示例管道有奇怪的换行符。这是具有更好格式的相同管道(在我看来),但有些人喜欢将所有“!”排列起来。角色。
来自 2 个文件源的数据过滤到文本覆盖元素源垫中。所有线路制动器均被忽略。
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 的输入。但 filesrc 没有输入,因此会发出错误。
“!”字符表示两个元素是连接的,但如果元素之间有空格,则仅意味着创建一个新元素,而不将其与前一个元素连接。关于工作管道需要指出的另一件事是,可以而且有必要设置元素的名称,以便稍后可以在管道中使用它。
我通过研究 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 是一个不同的元素,但在这里它的使用就像是 pad 的名称一样。 autovideosink 和 textoverlay 都没有同名的 pad。我想我不完全理解管道语法。
格式化管道的更好方法是:
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 的一部分。