使用ffmpeg在另一个视频上叠加流式视频

时间:2017-08-09 07:05:03

标签: ffmpeg

我正在运行一个使用fmpeg将straming视频发送到letsrobot.tv的机器人你可以在名为patton II的网站上看到我的机器人。我想在视频流上叠加视频HUD。

我有found a link解释如何执行此操作,但我不知道如何使用流式视频作为输入而不是单个图像文件。

这是当前用于流式传输视频的命令:

overlayCommand = '-vf dynoverlay=overlayfile=/home/pi/runmyrobot/images/hud.png:check_interval=500'
videoCommandLine = '/usr/local/bin/ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video%s %s -f mpegts -codec:v mpeg1video -s 640x480 -b:v %dk -bf 0 -muxdelay 0.001 %s http://%s:%s/hello/640/480/' % (deviceAnswer, rotationOption, args.kbps, overlayCommand, server, videoPort)
audioCommandLine = '/usr/local/bin/ffmpeg -f alsa -ar 44100 -i hw:1 -ac 2 -f mpegts -codec:a mp2 -b:a 32k -muxdelay 0.001 http://%s:%s/hello/640/480/' % (server, audioPort)

1 个答案:

答案 0 :(得分:1)

您已有一个输入,即网络摄像头视频:

-f v4l2 -framerate 25 -video_size 640x480 -i /dev/video%s

您想要叠加另一个视频,因此您必须添加第二个输入,即您的HUD流。我假设您已经有一个即时生成的流:

-i /path/to/hud/stream

然后,添加一个复合过滤器,将其覆盖在另一个上:

-filter_complex "[0:v][1:v]overlay[out]"

在过滤器之后,添加-map "[out]"选项以告知ffmpeg将生成的视频用作输出,并像往常一样添加剩余的选项。所以,总而言之:

/usr/local/bin/ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video%s \
-i /path/to/hud/stream \
-filter_complex "[0:v][1:v]overlay[out]" -map "[out]" \
-f mpegts -codec:v mpeg1video -s 640x480 -b:v %dk -bf 0 \
-muxdelay 0.001 %s http://%s:%s/hello/640/480/

显然,不知道更多,这是我能给你的最通用的建议。

一些一般提示:

  • 确保HUD流与网络摄像头视频的分辨率相同,其中元素放置在您想要的位置。或使用overlay filter's xy选项移动HUD。
  • 您的HUD流应该有透明层。并非所有编解码器和容器格式都支持它。
  • 您正在使用-codec:v mpeg1video,即MPEG-1视频。它资源效率很高,但质量很差。您可能希望选择更好的编解码器,但这取决于您的设备功能(例如,至少带有mpeg2的MPEG-2,带有mpeg4的MPEG-4第10部分,或带有{的H.264 {1}})。