cv2.VideoWriter 不会使用fourcc h.264写入文件(使用罗技c920,python 2.7,windows 8)
Posted
技术标签:
【中文标题】cv2.VideoWriter 不会使用fourcc h.264写入文件(使用罗技c920,python 2.7,windows 8)【英文标题】:cv2.VideoWriter will not write file using fourcc h.264 (with logitech c920, python 2.7, windows 8) 【发布时间】:2016-01-13 02:40:31 【问题描述】:我是 python (2.7) 和 opencv (3.0)(以及一般的视频流/写作)的新手,所以请原谅。
我使用罗技 c920 作为我的网络摄像头,它可以流式传输以 h264 格式压缩的视频,所以我正在尝试编写一个简单的应用程序来设置 VideoCapture 实例的 4 个属性(fourcc 到 h264;宽度到 1920;高度到 1080 ; 和 fps 到 30),然后将视频录制到名为 test.mp4 的上一级目录中,并在我的屏幕上显示录制内容。这是代码:
import sys
import cv2 as cv
cap = cv.VideoCapture(0)
fourcc = cv.VideoWriter_fourcc('H','2','6','4')
cap.set(6, fourcc)
cap.set(3,1920)
cap.set(4,1080)
cap.set(5, 30)
vid = cv.VideoWriter('../test.mp4', fourcc, 20.0, (640,480))
print vid.isOpened() #returns false :(
while (cap.isOpened()):
ret, frame = cap.read()
if (ret == True):
#gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
vid.write(frame)
cv.imshow('window', frame)
if (cv.waitKey(1) & 0xFF == ord('q')):
break
cap.release()
vid.release()
cv.destroyWindow('window')
cv.imshow('window',frame) 工作正常,属性都设置好了;但是, vid.isOpened() 返回 false 很明显我在上面做错了什么。如果我为fourcc传递-1,我可以从编解码器列表中进行选择,并且i420可用并且说(对于罗技相机)如果我将文件扩展名从mp4更改为avi(我猜想这意味着 i420 不能存储为 .avi ?),然而,test.avi 总是很大而且看起来很原始,100MB 用于几秒钟的测试视频并且不会打开。
任何帮助都会很棒,非常感谢
【问题讨论】:
【参考方案1】:所以到目前为止我发现的解决方法不是那么有效,但它在 Ubuntu 16.04 上对我有用。定期写完视频后,我用H264编码器再次转换,最终的视频大小比我单独从opencv得到的要小很多。
这里是解决方法:
import os # We will use it to access the terminal
# Write the video normally using mp4v and make the extension to be '.mp4'
# Note: the output using "mp4v" coder may be efficient for you, if so, you do not need to add the command below
cv2.VideoWriter('Video.mp4',cv2.VideoWriter_fourcc(*"mp4v"), NewFPS, (width,height))
# When your video is ready, just run the following command
# You can actually just write the command below in your terminal
os.system("ffmpeg -i Video.mp4 -vcodec libx264 Video2.mp4")
【讨论】:
【参考方案2】: 请记住,OpenCV 会自动解压缩来自网络摄像头的传入 H264 流。您不能传递压缩流。您必须重新压缩。 由于 -1 的编解码器 ID 会显示一个提示,要求您选择编解码器,因此我假设您使用的是 Windows。在 Windows 上,OpenCV 使用ffmpeg or "Video for Windows" backends。不幸的是,您似乎无法判断 OpenCV 何时使用哪个后端。要求选择编码器的对话框看起来像 VfW 对话框。没有sane h264 VfW 编码器,你可能没有安装像x264vfw 这样的黑客,所以你不能在这里选择 h264。 AVI container does not support b-Frames。 H264 默认使用 b 帧。您不能在 OpenCV 中更改这些编码器设置。因此,您不应为 H264 编码的视频选择 AVI。 为了保存到另一个容器,应该使用 ffmpeg。我只能猜测 OpenCV 明智地基于容器来优化后端。您应该能够将 h264 编码为 MKV 或 MP4。请记住,有某种"FOURCC to ffmpeg-Encoder-ID" translation 发生。【讨论】:
【参考方案3】:如果您通过 pip install opencv-python 安装了此软件包,则不支持 x264 编码,因为它在 GPL 许可下。升级 FFmpeg 无济于事,因为 opencv-python 自带 FFmpeg。
您必须手动编译 OpenCV 以获得对 H264 编码的支持。
Github 上的相关问题:https://github.com/skvark/opencv-python/issues/100#issuecomment-394159998
【讨论】:
以上是关于cv2.VideoWriter 不会使用fourcc h.264写入文件(使用罗技c920,python 2.7,windows 8)的主要内容,如果未能解决你的问题,请参考以下文章
cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它
使用 cv2 VideoWriter 编写 numpy 数组
如何在 cv2.VideoWriter 中使用 FPS 参数?