我想将 IP 摄像头与 webrtc 结合使用。但是 webrtc 似乎仅支持网络摄像头。因此我尝试将 IP 摄像头的流转换为虚拟网络摄像头。
我发现像网络摄像机适配器,但它们运行效果不佳(每秒 2-3 帧,延迟 2 秒),并且它们只能在 Windows 上运行,我更喜欢使用 Linux(如果可能的话)。
我尝试 ffmpeg/avconv: - 首先,我创建了一个虚拟设备v4l2loopback(命令为:)sudo modprobe v4l2loopback
。虚拟设备已被检测到,并且可以使用以下命令为其提供视频(.avi): ffmpeg -re -i testsrc.avi -f v4l2 /dev/video1
-IP 摄像机的流可用于:rtsp://IP/play2.sdp
适用于 Dlink DCS-5222L 摄像机。此流可通过 ffmpeg 捕获。
我的问题是如何在这两个步骤之间建立链接(接收 rstp 流并将其写入虚拟网络摄像头)。我试过了,ffmpeg -re -i rtsp://192.168.1.16/play2.sdp -f video4linux2 -input_format mjpeg -i /dev/video0
但 v4l2 出现错误(未找到 v4l2)。
有人知道如何将 IP 摄像机的流转换为虚拟摄像机吗?
答案1
实际上,您第一次尝试时就非常接近了。输入格式在参数之前指定-i
,如下所示:-f mjpeg -i rtsp://192.168.1.16/play2.sdp
,并且您可能必须指定像素格式,例如,yuv420p
才能进行转换为v4l2
(-pix_fmt yuv420p
)。这给我们留下了类似这样的结果:
$ ffmpeg -f mjpeg -i rtsp://192.168.1.16/play2.sdp -pix_fmt yuv420p -f v4l2 /dev/video0
v4l2
你可以通过运行以下命令来检查你的 ffmpeg 安装是否支持
$ ffmpeg -formats 2>/dev/null | grep v4l2
如果返回非零退出代码(并且不打印结果),那么您必须自己编译 ffmpeg,或者找到v4l2
启用该功能的版本。有关更多信息,请参阅ffmpeg 网站。
最后,还有一个非常相关的问题在 StackOverflow 上,但它没有回答您的具体问题(关于使用 IP 摄像头作为网络摄像头)。
答案2
FFMpeg 可以从您的 IP 摄像头接收视频并将其转发到虚拟摄像头设备。为此,您需要首先指定 IP 摄像头的所有参数,我猜如下:
-f video4linux2 -input_format mjpeg -i rtsp://192.168.1.16/play2.sdp
然后是所有输出参数,如您在示例中所使用的:
-f v4l2 /dev/video1
因此尝试这个命令:
ffmpeg -f video4linux2 -input_format mjpeg -i rtsp://192.168.1.16/play2.sdp -f v4l2 /dev/video1
答案3
decodebin
您也可以使用 gstreamer,因为 ffmpeg 和 avconv 可能对 v4l2 格式存在问题。请注意管道中的使用。
gst-launch rtspsrc location=rtsp://192.168.2.18/play.sdp ! decodebin ! v4l2sink device=/dev/video1
答案4
我花了很长时间才弄明白,但我用来让我的 v380 在我的 Linux 机器(ubuntu 20.04)上运行的命令是:
ffmpeg -re -rtsp_transport tcp -i rtsp://192.168.1.29:554/ch00_1 -f v4l2 /dev/video0
效果很好,但无法让它返回到我的提示符 - ffmpeg 程序显示它正在录制...并且正在录制,但却从不返回到我的提示符。我必须按 ctrl-c 键,但那......不是我想要或需要的。
我该如何做才能不用每次都输入那个命令?我希望摄像头在重启后仍然可用,但不知道如何实现。谷歌搜索失败,因为谷歌想要假设我想要什么而不是倾听,要么这样,要么......我不知道如何向谷歌提问。
请帮忙,我已经很接近了,只需要 ffmpeg 返回到我的提示,但保持摄像头连接到 /dev/video0 并让它在重启后继续运行。
编辑:我按下 ctrl-c 并返回到我的提示。重新启动“运动”服务,并且...相机正在工作。如此困惑。仍然无法在重启后幸存,上帝知道我记不住那个 ffmpeg 命令。