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 参数?

cv2.VideoWriter() 在带有 Raspicam 的 Raspberry Pi 上不起作用

cv2.VideoWriter 保存图像为视频的几个问题

图像转视频