如何使用gstreamer覆盖带字幕的视频

时间:2016-08-21 03:03:39

标签: video-streaming gstreamer

此问题与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/查看文档并搜索示例,但我显然仍然不了解如何将流组合在一起。我没有尝试复制上一个问题中的示例,因为我还没有理解这一切,我想从一些基本的东西开始,我可以根据需要添加。

3 个答案:

答案 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的一部分。