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

Video streaming 如何使用gstreamer覆盖带有字幕的视频,video-streaming,gstreamer,Video Streaming,Gstreamer,这个问题与 我想用SRT文件中的字幕覆盖MP4视频 在我看来,这个过程需要两个线程:一个读取和解码MP4文件,另一个读取和解析字幕。然后它们需要以某种方式组合起来,这就是我认为元素subtitleoverlay的目的。最后,我想查看结果。(当这项工作正常时,我将用Python重新编写它,并将其安装在一个web服务器后面,该服务器将使用自定义字幕覆盖视频内容并流式传输结果。) 这是我的第一次尝试: gst-launch-1.0 -v \ filesrc location=titles.srt

这个问题与

我想用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

我是一名经验丰富的程序员,但对视频流处理完全是新手。我花了数小时在上浏览文档并搜索示例,但显然我仍然不了解如何将流组合在一起。我没有试图复制上一个问题中的示例,因为我还没有完全理解,我想从一些基本的东西开始,我可以根据需要添加这些东西。

我通过研究下面的textoverlay示例找到了解决方案:


我仍然不明白“filesrc”对autovideosink和textoverlay做了什么。是一个不同的元素,但在这里,它的使用就好像它是一个pad的名称一样。autovideosink和textoverlay都没有该名称的焊盘。我想我还没有完全理解管道语法。

我通过研究下面的textoverlay示例找到了解决方案:


我仍然不明白“filesrc”对autovideosink和textoverlay做了什么。是一个不同的元素,但在这里,它的使用就好像它是一个pad的名称一样。autovideosink和textoverlay都没有该名称的焊盘。我想我不完全理解管道语法。

示例管道有奇数的换行符。在我看来,这是一条格式更好的管道,但有些人喜欢把所有的“!”都排成一行人物

来自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个文件源的数据过滤到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没有输入,因此会发出错误


“!”字符表示两个元素已连接,但如果元素之间有空格,则表示创建新元素时未将其连接到上一个元素。关于工作管道的另一点需要指出的是,设置元素的名称是可能的,也是必要的,以便以后可以在管道中使用它。

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

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

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

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