我有一个 IP 摄像头,我从该 IP 摄像头接收快照 JPEG。平均速度约为 10fps。
目前,我正在我的 c# 桌面应用程序中调用 [web 方法] 来上传 JPEG(转换为字节数组)。在那里,用户可以在服务器上像视频源一样查看这些图像。这很有效。在客户端,RAM 使用率上升得相当高。
如果我可以使用 ffmpeg 以某种方式对 JPEG 图像进行编码,那么数据量就会减少(我猜)。
或者有没有办法从传入的 JPEG 中获取字节流并以某种方式重定向到服务器,在那里我可以运行另一个 ffmpeg 进程等待接受该流并将图像流保存到单个图像?
我四处寻找(花了几天时间)并尝试了不同的技术来减少图像的“重量”,但似乎没有任何效果。我现在将 ffmpeg 视为我的最后希望。
答案1
如果您在代码中原生不使用 FFmpeg API,您也可以调用 ffmpeg 将您想要的任何内容输出为原始字节流。例如:
ffmpeg-i输入-c:v mjpeg -f 原始视频 -
表示-
输出被发送到stdout
。ffmpeg 诊断消息将像往常一样发送到stderr
。您可以在程序中捕获此输出,并通过简单的 UDP 传输将其流式传输到侦听服务器。
为了进一步压缩您的流,您当然可以不逐张发送图像,而是将图像压缩为原始 H.264 视频流:
ffmpeg-i输入-c:v libx264-预设超快-f rawvideo-
然后,您将像这样解析传入的流,-
其中stdin
:
ffmpeg -f rawvideo -c:v h264 -i- 输出
当然,您需要弄清楚如何正确地传输数据。ffmpeg 也可以从 Unix 管道读取。
我也做过类似的事情,没有使用 FFmpeg,而是使用XviD 编码器库使用 C++ 生成视频比特流,然后通过 UDP 将其发送到另一台机器,并从那里进行解析。这是可行的,但这取决于您的网络堆栈是什么样子,以及它需要多么复杂(和容错)。