【问题标题】:How to Write to AVI with OpenCV Python on Windows 10如何在 Windows 10 上使用 OpenCV Python 写入 AVI
【发布时间】:2019-12-06 10:36:31
【问题描述】:

我想将格式正确的视频数据帧写入 AVI。

所有尝试都失败了。

经过长时间的调试,我最终得到的是所需目录中长度非零的 *.avi 文件,这些文件无法与我系统上已安装的多个视频播放器中的任何一个一起播放。

请注意:高质量的答案将以完整和细节为导向。特别是,有关使用 OpenCV 编写视频的问题往往会产生匆匆忙忙的回应,其中包括要粘贴在 fourcc 中的另一个四字母代码。这样做的答案至少也没有告诉我要使用什么文件扩展名,它将生成什么文件类型,以及为什么预计它可以胜过我上面给出的内容是没有帮助的。

以下是系统的主要细节:

操作系统:Windows 10 语言:Python 3.7,Anaconda 3 OpenCV:4.1.0

这是我做过/尝试过的:

按照this link安装FFMPEG,重启Anaconda,在Anaconda内部验证ffmpeg(ffmpeg -version),结果如下:

ffmpeg version N-94396-g47b6ca0b02 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9.1.1 (GCC) 20190716
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
libavutil      56. 32.100 / 56. 32.100
libavcodec     58. 55.100 / 58. 55.100
libavformat    58. 30.100 / 58. 30.100
libavdevice    58.  9.100 / 58.  9.100
libavfilter     7. 58.100 /  7. 58.100
libswscale      5.  6.100 /  5.  6.100
libswresample   3.  6.100 /  3.  6.100
libpostproc    55.  6.100 / 55.  6.100

主题的多种变化:

import cv2
fourcc = cv2.VideoWriter_fourcc(*"DIVX")
vidout = cv2.VideoWriter(baseDir + "videos\\foo.avi", fourcc, 30, (530, 476))

for frame in frames:
    <do stuff to generate foo>
    cv2.imshow("foo", foo)
    vidout.write(foo)
vidout.release()

使用cv2.imshow("foo", foo) 验证输出数据的形状、dtype 和一般可行性

结果:无法播放的 AVI 文件

【问题讨论】:

    标签: python windows opencv ffmpeg


    【解决方案1】:

    我真的不明白你想要做什么,但我的虚拟助手中有一个代码,它使用 opencv(cv2 库)录制视频并将其保存为 .avi(opencv 没有音频不支持)使用 python 3.6

    import cv2
    
    def main():
        window_name = "Eri is recording this!"
        cv2.namedWindow(window_name)
    
        cap = cv2.VideoCapture(0)
    
        filename = "F:\\Video.avi"
        codec = cv2.VideoWriter_fourcc("X", "V", "I", "D")
        frame_rate = 30
        resolution = (640, 480)
        Output = cv2.VideoWriter(filename, codec, frame_rate, resolution)
        if cap.isOpened():
           ret, frame = cap.read()
        else:
           ret = False
    
        while ret:
           ret, frame = cap.read()
    
           Output.write(frame)
    
           cv2.imshow(window_name, frame)
           if cv2.waitKey(1) == 27:
              break
    
        cv2.destroyAllWindows()
        Output.release()
        cap.release()
    if __name__ == '__main__':
       main()
    

    希望这会有所帮助。 PS。如果您在尝试我的代码时遇到任何错误。就告诉我嘛。它现在工作 101% PS2。将“文件名”变量的值更改为您想要保存视频的路径。您只能保存一个视频。这意味着如果您不复制或重命名您捕获的先前视频,它将被覆盖。按 ESC 键结束流

    【讨论】:

      【解决方案2】:

      我尝试过的事情:

      使用 cv2.imshow("foo", foo) 验证输出数据的形状、dtype 和一般可行性

      显然不是。

      cv2.imshow("foo", foo)对对象 foo 形状的前两个维度(即行和列)没有任何期望。

      但是,如果 foo.shape 是 (x, y, channels) 那么 writer 需要定义为:

      vidout = cv2.VideoWriter(baseDir + "videos\\foo.avi", fourcc, 30, (y, x))
      

      注意 x 和 y 的转置。

      所以你可以生成你想要的所有数据帧,将它们发送到cv2.imshow(foo) 进行验证,使用foo.shape 手动获取数据的形状,天真地将报告的形状放入 VideoWriter 设置中,然后运行它.该软件将毫无怨言地运行。它将生成指定的 AVI 文件。并且AVI文件将是无法播放的垃圾。

      太棒了。

      【讨论】:

        猜你喜欢
        • 2013-01-23
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 2016-02-11
        • 2017-08-17
        • 1970-01-01
        • 2010-09-27
        相关资源
        最近更新 更多