【问题标题】:How to use gstreamer to overlay video with subtitles如何使用 gstreamer 用字幕覆盖视频
【发布时间】:2023-04-02 03:59:01
【问题描述】:

此问题与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 重新编写它并将其安装在一个网络服务器后面,该服务器将使用自定义字幕覆盖视频内容并流式传输结果。)

这是我的第一次尝试:

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


    【解决方案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 没有输入,所以会发出错误。

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

    【讨论】:

      【解决方案2】:

      我通过研究 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 都没有同名的 pad。我想我不完全理解管道语法。

      【讨论】:

        【解决方案3】:

        格式化管道的更好方法是:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多