这是一个使用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缩放比例无效
我不是ffmpeg大师。有人成功做到了吗?
摆弄了一些摆弄,但我使用FFmpeg rawvideo demuxer弄清楚了:
python capture.py | ffmpeg -f rawvideo -pixel_format bgr24 -video_size 640x480 -framerate 30 -i - foo.avi
由于原始视频中没有标头来指定假定的视频参数,因此用户必须指定它们才能正确解码数据:
-framerate
-pixel_format
-video_size
对于高级用户来说,这里还有一些额外的东西。相同,但使用VLC将实时输出流式传输到Web Flash格式:
python capture.py | cvlc --demux=rawvideo --rawvid-fps=30 --rawvid-width=320 --rawvid-height=240 --rawvid-chroma=RV24 - --sout "#transcode{vcodec=h264,vb=200,fps=30,width=320,height=240}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=:8081/stream.flv}"
编辑:使用ffmpeg和ffserver创建一个webm流
python capture.py | ffmpeg -f rawvideo -pixel_format rgb24 -video_size 640x480 -framerate 25 -i - http://localhost:8090/feed1.ffm