使用ffmpeg从IP摄像机获取流并保存为jpeg(图像)文件

3
我该如何从 IP 摄像头获取流,它使用 RTP,流是 MPEG4,我有多播地址和端口,也有摄像头的 IP 地址和端口号。
我无法通过 http 访问(例如 http://ip/jpeg), 也无法通过 VLC Player 访问流(例如 rtp://ipadressofcam:port 和 rtp://multicastaddress:port)。
所以,ffmpeg 的命令是什么?
我使用的是 Windows 操作系统,目前只用 C# 编写代码。
但制造商创建了自己的 ocx 用于查看摄像头,该插件可以在 .net 上工作,但我不想使用它,因为其功能不够强大,我的意思是你无法获取当前图片或快照,这就是为什么我必须自己来完成。

http://www.codeproject.com/KB/audio-video/cameraviewer.aspx - Just Me
1
你确定 @ 吗?能给我看一下参考资料吗?你试过了吗?我不想证明它。自己去搜索吧。 - L.B
2
这里还有另一个来源http://forums.whirlpool.net.au/archive/911984。只需搜索`rtp://@`即可,这样您就不必尝试键盘上的所有字符了。 - L.B
@L.B 哦,好的 :) 谢谢你的帮助,我会在工作中尝试它们!我会告知结果是否成功 - Mustafa Ekici
1
相机的制造商和型号是什么?一些IP相机可以选择以m-jpeg流式传输或定期转储jpg文件。 - Alvin K.
显示剩余8条评论
4个回答

2

您确定流不是受到密码保护的吗?

尝试查看相机为什么拒绝VLC请求。以下是操作步骤:安装Wireshark,启动它,并为相机地址设置过滤器,例如:ip.addr == camera_ip(xxxx.xxxx.xxxx.xxxx)。然后,尝试使用VLC连接,并查看交换的消息。如果看到DROP、UNAUTH或其他提示使用密码的信息,请输入密码。(VLC将首先尝试使用未经身份验证的过程进行连接,如果失败,将要求输入密码。)

如果失败原因不同,Wireshark会给您提供线索。

请记住,如果VLC无法访问它,则几乎没有找到其他方法的机会。除非您是视频专家。

希望这可以帮助您!


谢谢你的回答,我不在乎VLC是否打开它,我只是需要用C#来控制这个流。再次感谢你提供的信息。 - Mustafa Ekici

2

@mekici,你认为VLC无法打开它是因为协议问题、容器问题还是编解码器问题?如果你能提供一个样本,我可以为你提供一些工具来使用! - Rosmarine Popcorn
我该怎么做?你是指将视图录制为 .avi 文件吗? - Mustafa Ekici
@mekici,我们可以在聊天中继续吗? - Rosmarine Popcorn
使用C#解码流 - Rosmarine Popcorn
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/4867/discussion-between-cody-and-mekici - Rosmarine Popcorn
显示剩余2条评论

2
您想从摄像头接收视频流,并将每个帧转换为JPEG文件。这听起来很好,实际上也很自然:为什么不呢?网络上正在发送视频源,我们只需要挑选出单个帧。

原始流是MPEG-4(第2部分),期望的目标编码是JPEG。这将任务分解为获取MPEG-4视频源,将其解码为未压缩图像,然后编码为JPEG。让我们从最后一个开始逐个进行介绍。

JPEG是一种常用的编码方式,有各种具有不同接口的编解码器可以压缩成JPEG。选项包括GDI+ APIIJG JPEG library libjpeg,以及DirectShow和其他接口的视频JPEG库和编解码器。
MPEG-4解码器是一个复杂的组件,但幸运的是它已经被很好地标准化,并且有许多不同的接口和来源可供选择。特别地,MPEG-4第2部分视频解码器作为DMO(并且也通过Windows 7)进行发货。解码器也可以作为ffdshow、英特尔媒体SDK中的DirectShow过滤器获得。
回到第一步,您需要从网络中获取MPEG-4流。首先,您指出摄像机可以在多播UDP地址上使用。这使您打开一个套接字并将其放入多播组中以开始接收RTP数据。您将收到的数据还不是纯MPEG-4格式,而是根据MPEG-4音频/视觉流的RTP有效载荷格式进行格式化的。当您接收到消息的RTP流时,您必须准备好接收无序片段、数据包丢失等。您应该尽力接收您能够接收到的内容,检查RTP头,并尽力重建MPEG-4源。
最终,您需要覆盖这些步骤(不一定是直接的,您更愿意使用第三方库,包括其他答案中提到的库),从您的应用程序中构建一个流水线,将网络接收和转码组合在一起。

0

到目前为止,我发现VLC无法打开它,但如果我们创建一个.sdp文件并使用ffplay播放它,只会出现黑屏。

vlc -vvv dshow:// --sout-keep --sout-all --sout=#rtp{dst=multicastaddress,port=portNo,sdp=file:///C:/test/my.sdp}

当然这不是一个完美的解决方案,但还是有一点希望。

但是过时的解决方案可能是这样的:
只使用C#无法实现我想要的功能。有一些C++库组件可以使用,但我可以使用Managed C++编写Interop服务并在我的C#代码中使用这些dll。这是我需要的:

1-我需要一个RTP库,http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib 或者live555,但live555有一定的限制。
2-RTP库是我从编码器中拉取MPEG4流的传输方式。但我需要控制流的方式,这些由生产者的WSDL提供。
3-之后我需要一个解码器;Libavcodec,我可以使用libavcodec将I帧转换为.NET中的JPEG图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接