这是一个使用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
libavformat 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]从比特率估算持续时间,这可能不准确
从'pipe:'输入#0,image2pipe:
持续时间:不适用,比特率:不适用
流#0.0:视频:0x0000,bgr8、25 fps,25 tbr,25 tbn,25 tbc
swScaler:0x0-> 640x480缩放比例无效
捕获的帧绝对是640x480。
我很确定OpenCV图像类型(IplImage)的像素顺序是GBR,每个通道一个字节。至少,这似乎是从相机上脱落的。
我不是ffmpeg大师。有人成功做到了吗?