VideoWriter不会使用fourcc h.264编写文件(使用logitech c920、python 2.7、windows 8)

2024-05-12 19:07:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python(2.7)和opencv(3.0)(以及一般的视频流/写)还不熟悉,所以请原谅。

我正在使用logitech c920作为网络摄像头,它可以流式传输h264格式的压缩视频,因此我试图编写一个简单的应用程序,设置视频捕获实例的4个属性(fourcc到h264;width到1920;height到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')     

imshow('window',frame)工作得很好,属性都设置好了;但是,vid.isOpened()返回false,很明显我在上面做了一些错误的事情。如果fourcc通过了-1,我就可以从编解码器列表中选择i420,如果我将文件扩展名从mp4更改为avi(我想这意味着i420不能存储为.avi?),则i420是可用的,并且说(对于logitech相机)和vid.isOpened()返回true但是,test.avi总是很大,看起来很原始,对于几秒钟的测试视频来说是100MB,不会打开。

有什么帮助就好了,非常感谢


Tags: test视频windowframecvmp4capset
3条回答
  • 请记住,OpenCV会自动解压缩来自网络摄像头的H264流。不能传递压缩流。你必须重新压缩。
  • 由于-1的codec ID显示一个提示,要求您选择编解码器,因此我假设您是在Windows上。在Windows上,OpenCV使用ffmpeg or "Video for Windows" backends。不幸的是,您似乎无法判断OpenCV何时使用哪个后端。要求选择编码器的对话框看起来像VfW对话框。没有saneh264 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

所以到目前为止,我找到的解决方法并没有那么有效,但它在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")

如果您通过pip install opencv python安装了这个包,那么就没有对x264的编码支持,因为它在GPL许可下。升级FFmpeg没有帮助,因为opencv python附带了自己的FFmpeg。

您必须手动编译OpenCV才能获得对H264编码的支持。

Github上的相关问题:https://github.com/skvark/opencv-python/issues/100#issuecomment-394159998

相关问题 更多 >