【发布时间】:2011-08-15 01:46:30
【问题描述】:
这是一个使用 OpenCV 的 python 绑定读取网络摄像头的相当简单的示例:
'''capture.py'''
import cv, sys
cap = cv.CaptureFromCAM(0) # 0 is for /dev/video0
while True :
if not cv.GrabFrame(cap) : break
frame = cv.RetrieveFrame(cap)
sys.stdout.write( frame.tostring() )
现在我想将输出通过管道传输到 ffmpeg,如下所示:
$ python capture.py | ffmpeg -f image2pipe -pix_fmt bgr8 -i - -s 640x480 foo.avi
遗憾的是,我无法完全正确地使用 ffmpeg 魔法咒语,并且失败了
libavutil 50.15。 1 / 50.15。 1 libavcodec 52.72。 2 / 52.72。 2 libav 格式 52.64。 2 / 52.64。 2 libavdevice 52. 2. 0 / 52. 2. 0 libavfilter 1.19. 0 / 1.19。 0 libswscale 0.11。 0 / 0.11。 0 libpostproc 51. 2. 0 / 51. 2. 0 将#0 avi 输出到“out.avi”: 流 #0.0:视频:flv、yuv420p、640x480、q=2-31、19660 kb/s、90k tbn、30 tbc [image2pipe @ 0x1508640]max_analyze_duration 已达到 [image2pipe @ 0x1508640]从比特率估计持续时间,这可能不准确 输入 #0,image2pipe,来自 'pipe:': 持续时间:不适用,比特率:不适用 流 #0.0:视频:0x0000、bgr8、25 fps、25 tbr、25 tbn、25 tbc swScaler: 0x0 -> 640x480 是无效的缩放尺寸- 捕获的帧肯定是 640x480。
- 我很确定 OpenCV 图像类型 (IplImage) 的像素顺序是 GBR,每个通道一个字节。至少,这似乎是从相机中出来的。
我不是 ffmpeg 大师。有没有人成功做到这一点?
【问题讨论】:
-
天哪!将输出通过管道传输到 ffmpeg 的想法非常聪明!
-
我将
sys.stdout.write( frame.tostring() )替换为sys.stdout.buffer.write(cv2.imencode(".jpg", frame)[1].tobytes())以使其正常工作。
标签: python linux opencv ffmpeg pipe