我正在进行的这个项目的主要目标是使用python脚本获取任何网络摄像头镜头,使用opencv进行编辑,然后使用ffmpeg将编辑后的视频帧从v4l2loopback管道传输到虚拟网络摄像头。以下是我制作的示例代码,它在python 2.7:上完全按照我的意愿运行
import cv2
import subprocess as sp
import sys
cap = cv2.VideoCapture(1)
cv2.namedWindow('result', cv2.WINDOW_AUTOSIZE)
while True:
ret, frame = cap.read()
cv2.imshow('result', frame)
sys.stdout.write(frame.tostring())
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
然后用运行
python pySample.py | ffmpeg -f rawvideo -pixel_format bgr24 -video_size 640x480 -framerate 30 -i - -vf format=yuv420p -f v4l2 /dev/video17
然而,我希望它能与python3一起工作,而不是与2.7一起工作,我找到了一种方法,将";sys.stdout…";线路
sys.stdout.buffer.write(frame.tobytes())
这运行得很好,只是它只能以14帧/秒的速度运行,而2.7代码可以以30帧/秒运行。我有点不知道如何解决这个问题/这个问题到底是什么。如果有帮助的话,我会在树莓派上运行这个。非常感谢!
当管道连接到ffmpeg时,如何在python3中使用stdout.write
正如你的问题题为";当管道传输到ffmpeg时,如何在python3中使用stdout.write&";,我将首先回答这个问题:
sys.stdout.buffer.write(data)
这就是你的做法。
你已经知道了(正如我从你的问题中得到的答案(,所以我想这不是你真正在问的问题。
所以你真正的问题似乎是:
如何快速写入stdout
然而,这意味着您认为对stdout的写入速度很慢。为什么?(很可能是因为您更改的唯一一行涉及到写入stdout(。
让我们检查一下(使用探查器(,python脚本在哪里花时间做事情:
python3 -m cProfile -o pySample.prof pySample.py | ffmpeg -f rawvideo -pixel_format bgr24 -video_size 640x480 -framerate 30 -i - -vf format=yuv420p -f v4l2 /dev/video17
这创建了包含所有呼叫信息的CCD_ 1文件。我们可以检查一下:
import pstats
pstats.Stats("pySample.prof").sort_stats(pstats.SortKey.TIME).print_sorted(5)
这将为我们提供在运行脚本时消耗最多时间的5个函数。对我来说,这个返回:
Mon Nov 16 14:40:40 2020 pySample.prof
70698 function calls (68335 primitive calls) in 49.782 seconds
Ordered by: internal time
List reduced from 881 to 5 due to restriction <5>
ncalls tottime percall cumtime percall filename:lineno(function)
490 40.614 0.083 40.614 0.083 {method 'read' of 'cv2.VideoCapture' objects}
490 3.813 0.008 3.813 0.008 {method 'write' of '_io.BufferedWriter' objects}
490 2.334 0.005 2.334 0.005 {waitKey}
490 1.238 0.003 1.238 0.003 {method 'tobytes' of 'numpy.ndarray' objects}
1 0.913 0.913 49.783 49.783 pySample.py:1(<module>)
现在这很有趣。它基本上告诉我们,python花费了大量时间从视频设备读取数据,而将数据写入输出(并将其转换为字节(的时间非常少。
所以你的问题应该是:我如何用OpenCV加速视频抓取。
不幸的是,我无法回答那个一;-(