使用ffmpeg将流式视频覆盖到另一个视频上

使用ffmpeg将流式视频覆盖到另一个视频上,ffmpeg,Ffmpeg,我正在运行一个机器人,它使用fmpeg向letsrobot.tv发送扫射视频。你可以在名为巴顿II的网站上看到我的机器人。我想在流上叠加一个视频HUD 我已经解释了如何做到这一点,但我不知道如何用流式视频作为输入,而不是一个单一的图像文件 这是当前用于流式传输视频的命令: overlayCommand = '-vf dynoverlay=overlayfile=/home/pi/runmyrobot/images/hud.png:check_interval=500' videoCommandL

我正在运行一个机器人,它使用fmpeg向letsrobot.tv发送扫射视频。你可以在名为巴顿II的网站上看到我的机器人。我想在流上叠加一个视频HUD

我已经解释了如何做到这一点,但我不知道如何用流式视频作为输入,而不是一个单一的图像文件

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

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)

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

-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流的分辨率与网络摄像头视频的分辨率相同,元素放置在您想要的位置。或者使用
    x
    y
    选项移动抬头显示器
  • HUD流应该有一个透明层。并非所有的编解码器和容器格式都支持这一点
  • 您正在使用的是
    -codec:v mpeg1video
    ,它是MPEG-1视频。它的资源效率很高,但质量很低。您可能希望选择更好的编解码器,但这取决于您的设备功能(例如,至少是带有
    mpeg2
    的MPEG-2,或带有
    mpeg4
    的MPEG-4第10部分,或带有
    libx264
    的H.264)

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

-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流的分辨率与网络摄像头视频的分辨率相同,元素放置在您想要的位置。或者使用
    x
    y
    选项移动抬头显示器
  • HUD流应该有一个透明层。并非所有的编解码器和容器格式都支持这一点
  • 您正在使用的是
    -codec:v mpeg1video
    ,它是MPEG-1视频。它的资源效率很高,但质量很低。您可能希望选择更好的编解码器,但这取决于您的设备功能(例如,至少是带有
    mpeg2
    的MPEG-2,或带有
    mpeg4
    的MPEG-4第10部分,或带有
    libx264
    的H.264)

我没有尝试过任何东西,我不知道该将代码放在哪里,甚至不知道如何设置它。我将其安装为一个软件包,我将其写入SD卡,它都是预安装的,我可以在这里上传控制视频的当前python脚本吗?overlyCommand='-vf dynoverlay=overlyfile=/home/pi/runmyrobot/images/hud.png:check_interval=500'videoCommandLine='/usr/local/bin/ffmpeg-f v4l2-帧速率25-视频大小640x480-I/dev/video%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,OverlyCommand,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)很抱歉,现在在操作系统中添加了我认为您需要的内容,正如我所说,如果您不能显示生成命令的Python代码,而是实际的命令(即,执行
打印(videoCommandLine)
并显示它),那就太好了。您运行过它们吗?是否遇到任何错误?或者你面临的具体问题是什么?另外,您使用MPEG-1视频有什么特别的原因吗(它非常陈旧且效率低下)?最后,我在官方FFmpeg中找不到
dynoverlay
过滤器。你从哪里弄来的?您是否正在使用2016年9月提出的修补程序?(你可以删除过时的评论。)我没有尝试过任何东西,我不知道把代码放在哪里,甚至不知道如何设置它。我把它作为一个软件包安装在SD卡上,它都是预先安装的,我可以在这里上传控制视频的当前python脚本吗?overlyCommand='-vf dynoverlay=overlyfile=/home/pi/runmyrobot/images/hud.png:check_interval=500'videoCommandLine='/usr/local/bin/ffmpeg-f v4l2-帧速率25-视频大小640x480-I/dev/video%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,OverlyCommand,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)很抱歉,现在在操作系统中添加了我认为您需要的内容,正如我所说,如果您不能显示生成命令的Python代码,而是实际的命令(即,执行
打印(videoCommandLine)
并显示它),那就太好了。您运行过它们吗?是否遇到任何错误?或者你面临的具体问题是什么?另外,您使用MPEG-1视频有什么特别的原因吗(它非常陈旧且效率低下)?最后,我在官方FFmpeg中找不到
dynoverlay
过滤器。你从哪里弄来的?您是否正在使用2016年9月提出的修补程序?(你可以删除过时的评论。)视频不会是一个流,它将是一个实际的视频…流是来自摄像机,覆盖是来自视频文件,也是。