没错,OpenCV 的默认像素格式是BGR。
ffmpeg 端的等效格式为BGR24,因此如果您不想,则无需将其转换为 YUV420p。
这篇文章展示了如何使用 python 应用程序从网络摄像头捕获帧并将帧写入stdout。目的是在 cmd-line 上调用此应用程序并将结果直接通过管道传输到 ffmpeg 应用程序,该应用程序将帧存储在磁盘上。确实很聪明!
捕获.py:
import cv, sys
cap = cv.CaptureFromCAM(0)
if not cap:
sys.stdout.write("failed CaptureFromCAM")
while True :
if not cv.GrabFrame(cap) :
break
frame = cv.RetrieveFrame(cap)
sys.stdout.write( frame.tostring() )
而要在shell上执行的命令是:
python capture.py | ffmpeg -f rawvideo -pix_fmt bgr24 -s 640x480 -r 30 -i - -an -f avi -r 30 foo.avi
哪里:
- -r 给出来自相机的帧速率
- -an 表示“不编码音频”
我在我的 Mac OS X 上使用 OpenCV 2.4.2 测试了这个解决方案。
编辑:
如果您还没有尝试从相机录制并使用 OpenCV 将视频写入磁盘上的 mp4 文件,我们开始:
import cv, sys
cap = cv.CaptureFromCAM(0) # 0 is for /dev/video0
if not cap:
sys.stdout.write("!!! Failed CaptureFromCAM")
sys.exit(1)
frame = cv.RetrieveFrame(cap)
if not frame:
sys.stdout.write("!!! Failed to retrieve first frame")
sys.exit(1)
# Unfortunately, the following instruction returns 0
#fps = cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FPS)
fps = 25.0 # so we need to hardcode the FPS
print "Recording at: ", fps, " fps"
frame_size = cv.GetSize(frame)
print "Video size: ", frame_size
writer = cv.CreateVideoWriter("out.mp4", cv.CV_FOURCC('F', 'M', 'P', '4'), fps, frame_size, True)
if not writer:
sys.stdout.write("!!! Error in creating video writer")
sys.exit(1)
while True :
if not cv.GrabFrame(cap) :
break
frame = cv.RetrieveFrame(cap)
cv.WriteFrame(writer, frame)
cv.ReleaseVideoWriter(writer)
cv.ReleaseCapture(cap)
我已经在 Mac OS X 和 OpenCV 2.4.2 上使用 Python 2.7 对此进行了测试。