无法从Py OpenCV创建的视频中解复用流

问题描述 投票:0回答:1

我正在尝试使用OpenCV从单个帧中创建视频。尽管代码运行没有错误,但是我无法播放生成的avi文件。当我这样做时,我得到的错误是Could not demultiplex stream

我用于执行此操作的代码的精简版本是:

import caffe
import cv2
import fnmatch
import os

# Get Image List
image_list = fnmatch.filter('./sample/images','*.png')
image_list.sort()

# Create VideoWriter
# codec = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
# codec = -1
codec = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
video = cv2.VideoWriter( './movieT.avi',
                         codec,
                         20,
                         (289, 289))

for img_name in image_list:
    # Load image
    im_path = os.path.join('./sample/images',img_name)
    img = caffe.io.load_image(im_path)

    # Resize image to expected size
    img = caffe.io.resize(img,(289, 289, 3))

    # Write image
    video.write(img)
video.release()

我在Google上搜索了一下,发现的主要错误是确保图像大小与cv2.VideoWiter预期的大小相匹配,并且我具有正确的编解码器。我调整图像大小以确保它们是正确的大小,然后尝试了几种不同的编解码器。我也尝试使用一些apt-get install命令来安装标准编解码器,这些命令也是Google在Google搜索中发现的:

me@balin:~$ sudo apt update
me@balin:~$ sudo apt install libdvdnav4 libdvdread4 gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly libdvd-pkg
me@balin:~$ sudo apt install ubuntu-restricted-extras

我当前正在使用:

Ubuntu 18.04
Python 2.7.17
cv2.__version__ 4.0.1
python opencv codec
1个回答
0
投票

我认为您在错误使用fnmatch.filter()时遇到的问题,该问题不会从文件夹中获取文件名,而仅用于检查文件名是否匹配模式。

请参见fnmatch中的示例

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)

使用您的代码,我总是得到一个空列表,因此以后它无法向视频添加任何图像,因此我无法显示该视频。

但是您可以为此使用glob.glob()

image_list = glob.glob('./sample/images/*.png')

此代码对我有用

import cv2
import glob

image_list = glob.glob('./sample/images/*.png')
image_list.sort()
#print(image_list)

codec = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
video = cv2.VideoWriter('./movieT.avi', codec, 20, (289, 289))

for img_name in image_list:
    img = cv2.imread(img_name)
    img = cv2.resize(img, (289, 289))
    video.write(img)

video.release()
© www.soinside.com 2019 - 2024. All rights reserved.