无法从 Py OpenCV 创建的视频中解复用流
Cannot Demultiplex Stream from Video created by Py OpenCV
我正在尝试使用 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
命令安装标准编解码器,我也通过谷歌搜索发现:
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
我认为你的问题是 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()
我正在尝试使用 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
命令安装标准编解码器,我也通过谷歌搜索发现:
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
我认为你的问题是 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()