使用 Python 通过以太网进行高 FPS 直播

High FPS livestream over ethernet using Python

我计划建造一个 ROV,我正在制作我的视频提要 atm。我将使用光纤进行所有通信,并且我正在修补 opencv 以使用 python 流式传输网络摄像头。我可能会选择使用 IP 摄像头,但我想先在 python 中详细了解如何从网络摄像头捕获帧。因为我不知道我最终要使用什么,所以我买了一个便宜的 noname USB 网络摄像头,只是为了尝试让一切正常工作。此摄像头供稿将用于导航,单独的录像机可能用于录制视频。

够了,现在是我的问题。当我捕获帧时,我只能得到 8 FPS,但我怀疑这是由于廉价的网络摄像头。网络摄像头连接到 pcduino 3 nano,后者连接到 arduino 以控制推进器和读取传感器。我从来没有想过如何利用硬件来编码和解码图像,我对这部分的了解还不够多,不知道我是否可以利用任何硬件。

你们相信我的网络摄像头是瓶颈吗?使用 IP 摄像机是更好的主意,还是我应该能够使用连接到带有 opencv 或其他方式的 pcduino 3 nano 捕获帧的网络摄像头来获得不错的 FPS?我尝试使用 Pygame 捕获帧,结果相同,我还尝试了 mjpg-streamer。

我是用 Python 编程的,这是我做的测试:

import cv2, time
FPS = 0
cap = cv2.VideoCapture(0)

last = time.time()

for i in range(0,100):
    before = time.time()
    rval, frame = cap.read()
    now = time.time()
    print("cap.read() took: " + str(now - before))
    if(now - last >= 1):
        print(FPS)
        last = now
        FPS = 0
    else:
        FPS += 1
cap.release()

结果在行中:

cap.read() took: 0.118262052536
cap.read() took: 0.118585824966
cap.read() took: 0.121902942657
cap.read() took: 0.116680860519
cap.read() took: 0.119271993637
cap.read() took: 0.117949008942
cap.read() took: 0.119143009186
cap.read() took: 0.122378110886
cap.read() took: 0.116139888763
8

网络摄像头应在其规格中明确说明其帧速率,这将明确告诉您瓶颈是否在于摄像头。

不过,我猜瓶颈是pcDuino3。很可能它无法非常快速地解码视频,这会导致低帧率。您可以在实际计算机上尝试这个确切的代码来验证这一点。另外,我相信 OpenCV 和 mjpg-streamer 都使用 libjpeg 来解码 jpeg 帧,所以它们相似的帧率也就不足为奇了。