繁体   English   中英

cv2.VideoWriter不会使用fourcc h.264(使用Logitech c920,python 2.7,Windows 8)写入文件

[英]cv2.VideoWriter will not write file using fourcc h.264 (with logitech c920, python 2.7, windows 8)

我是python(2.7)和opencv(3.0)的新手(以及一般的视频流/编写),因此请原谅。

我正在使用Logitech 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可用,并且说(对于Logitech摄像机),并且如果我将文件扩展名从mp4更改为avi,则vid.isOpened()返回true。猜测这意味着i420无法存储为.avi?),但是test.avi总是很大,看似原始,几秒钟的测试视频为100MB,并且无法打开。

任何帮助都会很棒,非常感谢

  • 请记住,OpenCV会自动从网络摄像头解压缩传入的H264流。 您无法传递压缩流。 您必须重新压缩。
  • 由于编解码器ID -1显示提示要求您选择编解码器,因此我假设您在Windows上。 在Windows上,OpenCV使用ffmpeg或“ Video for Windows”后端 不幸的是,似乎您无法确定OpenCV何时使用哪个后端。 要求选择编码器的对话框看起来像VfW对话框。 没有健全的 h264 VfW编码器,您可能未安装像x264vfw这样的老旧的编码器,因此无法在此处选择h264。
  • AVI容器不支持b-Frames H264默认使用b帧。 您无法在OpenCV中更改这些编码器设置。 因此,您不应为H264编码的视频选择AVI。
  • 为了保存到另一个容器,应使用ffmpeg。 我只能猜测OpenCV会根据容器明智地配置后端。 您应该能够将h264编码为MKV或MP4。 请记住,会发生某种“从FOURCC到ffmpeg-Encoder-ID”的转换

因此,到目前为止,我发现的解决方法效率不高,但它在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM