当前位置: 首页 > 知识库问答 >
问题:

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

裴宏壮
2023-03-14

我不熟悉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(窗口,框架)工作正常,属性都设置好了;然而,vid.isOpen()返回false,所以很明显我在上面做错了什么。如果我通过-1为Fourcc,我被允许选择从编解码器和i420的列表是可用的,并说(对于罗技相机)和vid.is打开()返回true如果我改变文件扩展名从mp4到avi(我猜这意味着i420不能存储为. avi?),然而,test.avi总是巨大的,看起来很原始,几秒钟的测试视频100MB,不会打开。

如果能帮上忙就太好了非常感谢

共有3个答案

慕晨
2023-03-14

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

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

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

宋运锋
2023-03-14
  • 请记住,OpenCV会自动解压缩来自网络摄像头的传入H264流。您不能传递压缩流。你必须重新压缩
  • 由于编解码器ID为-1会显示一条提示,要求您选择编解码器,因此我假设您在Windows上。在Windows上,OpenCV使用ffmpeg或“Windows视频”后端。不幸的是,您似乎无法判断OpenCV何时使用哪个后端。要求选择编码器的对话框类似于VfW对话框。没有健全的h264 VfW编码器,您可能没有安装像x264vfw这样的黑客编码器,所以您不能在这里选择h264
  • AVI容器不支持b帧。H264默认使用b帧。不能在OpenCV中更改这些编码器设置。因此,您不应为H264编码视频选择AVI
  • 为了保存到另一个容器,应该使用ffmpeg。我只能猜测OpenCV基于容器明智地协调后端。您应该能够将h264编码为MKV或MP4。请记住,会发生某种“FOURCC到ffmpeg编码器ID”的转换
喻嘉泽
2023-03-14

所以到目前为止我发现的变通方法不是那么有效,但是它在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")
 类似资料:
  • 在通过“cv2”保存视频文件的过程中,我遇到了一个奇怪的问题。如果视频捕获发生在网络摄像头上,则此代码运行良好,但如果视频捕获来自文件(例如cap=cv2.VideoCapture(“test.avi”)),则会形成一个没有任何流的空文件。 我试图改变输入视频文件的格式,如。阿维。ts和输出也一样,但没有任何变化 谁知道为什么这个问题发生在我身上?

  • 我有一个程序从一个文本文件(目前有653行长)中读取,所有文件都用逗号分隔。但当我将文件保存到新位置时,它只保存了490行。新创建的文本文件中的最后一行似乎也被切成了两半。有什么问题吗? 这是我用来打开和排序列表中数据的代码: 以下是我用来保存文件的内容:

  • 我使用的是Eclipselink JPA,有一组DB实体,我想写入一个文件,以防我的DB连接在后续查询中不可用。我想使用Moxy简单地封送我的整个结果集,然后稍后取消对该文件的封送,从而重新创建我的原始结果集(这是我的JPA实体对象)。由于Eclipselink和Moxy在某种程度上是集成的,因此我想在我的JPA代码中了解一下,例如: 感谢您提供的任何帮助。

  • 我读了一个word文档,想用Java写到另一个word文件中。我想要读取的文档中的内容的样式(字体、粗体、斜体、标题等)被写入,因为它是创建的新文档。我可以复制内容,但不能复制格式样式。 我得到的答案是复制相同格式的文本,但我无法复制数字。我执行了以下代码:

  • 问题内容: 如何使用框架有效地从大文件读取并将大数据写入文件。 我工作,并和曾尝试类似如下: 谁能告诉我,如果我的文件大小超过2 GB,我应该遵循相同的步骤吗? 如果大量的书面操作,我想在写作时做类似的事情,该怎么办? 问题答案: 请注意,您可以像示例代码那样简单地用于复制文件,只是速度更快,而且仅一行代码。 否则,如果您已经打开了两个文件通道,则可以使用 将该通道的全部内容传输到该通道。请注意,

  • 下面是以下代码,它使用BufferedImage读取RGB值,然后简单地将它们再次写回文件。生成的图像是完美的,看起来很好。不用担心。 我运行了一个打印测试,打印出前10个RBG int值。这是为了测试“test.png”文件,然后测试结果图像——“new-test . png”。出于某种原因,我得到了不同的RBG值之间的两个文件。 例如(前3个RGB int值) test.png:-167042