OpenCV MPEG 视频流传输

3
我正在开发用于网络吞吐量测试的点对点视频流媒体。两个对等方之间的网络支持低比特率传输。
我使用OpenCV编写了一个简单的Python程序进行视频流媒体。该程序从网络摄像头获取视频帧,将其编码为JPEG,然后将字节流发送到对等方。它运行良好。但是,针对我的目的存在问题。即使使用较低的JPEG质量进行编码,一个编码帧的大小约为5 Kbytes。
为了获得更小的编码结果和更好的视频质量,我尝试使用MPEG编解码器,例如H264或H263进行编码。很快,我陷入了困境。互联网上没有任何示例。我该如何更改以下代码?
import cv2 
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
success, image = cap.read()
quality = 20 # quality 0 to 100. default:95
ret, jpeg = cv2.imencode('.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), quality])
# send(jpeg.tobytes())

你正在以什么分辨率进行流媒体传输?通常情况下,JPEG是你可以获得的最高压缩率。(每帧5千字节非常小) - Lilith Daemon
分辨率为320x240。在上述代码中,大小为len(jpeg.tobytes())。 - Hill
你是使用灰度还是彩色?你是否考虑过二进制图像?(然后发送二进制图像?)请参阅http://answers.opencv.org/question/4423/how-to-create-a-binary-image-mat/。 - Lilith Daemon
感谢您关注此主题。但恐怕所提到的二进制图像是未压缩的,可能会非常大。 - Hill
在这个例子中,他们没有压缩它。然而,与灰度图像相比,JPEG格式应该能够进一步压缩二进制图像。从你告诉我的信息来看,你已经做到了大约20倍的压缩(非常高)。你可以尝试的另一件事是将图像调整为160x120(应该可以将其压缩到约1.6-1.8 kbs)。 - Lilith Daemon
1个回答

1
这是一个关于从网络摄像头实时编码视频帧的答案!
我意识到使用OpenCV无法进行实时MPEG编码,尽管OpenCV可以将原始视频帧保存为MPEG文件。
我使用了开源工具ffmpeg来解决我的问题。 我让ffmpeg对视频帧进行编码并将其发送到UDP数据包中。 然后我的应用程序接收UDP数据包并在测试网络上进行流传输。数据的平均比特率为320x240 5 FPS,小于25kbps(每秒比特数)。
ffmpeg -s 320x240 -f dshow -i video="USB HD Webcam" -r 5 -vcodec msmpeg4v2 -b:v 25k -an -f h263 udp://127.0.0.1:10000

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