如何使用gstreamer给视频叠加字幕

问题描述 投票:0回答:3

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

video-streaming gstreamer
3个回答
2
投票

示例管道有奇怪的换行符。这是具有更好格式的相同管道(在我看来),但有些人喜欢将所有“!”排列起来。角色。

来自 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 没有输入,因此会发出错误。

“!”字符表示两个元素是连接的,但如果元素之间有空格,则仅意味着创建一个新元素,而不将其与前一个元素连接。关于工作管道需要指出的另一件事是,可以而且有必要设置元素的名称,以便稍后可以在管道中使用它。


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 是一个不同的元素,但在这里它的使用就像是 pad 的名称一样。 autovideosink 和 textoverlay 都没有同名的 pad。我想我不完全理解管道语法。


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

© www.soinside.com 2019 - 2024. All rights reserved.