Python OpenCV:对于mp4文件,保存电影是可行的,但使用了错误的编解码器

Python OpenCV:对于mp4文件,保存电影是可行的,但使用了错误的编解码器,python,opencv,video,codec,Python,Opencv,Video,Codec,我正在用Python和OpenCV制作一个视频编辑器,并测试不同的编解码器和文件格式组合。对于这个例子,我主要关注avi和mp4格式。我尝试了多个不同的四字符编解码器(),它们都保存了一部我可以播放的电影 令人困惑的是,当我重新加载它们并从电影中提取编解码器时,发现只有保存为avi的电影似乎是使用原始编解码器保存的。下面的图表显示了用于编码的编解码器(使用cv2.VideoWriter\u fourcc()创建),然后是加载后从视频中提取的相应编解码器(使用get(cv2.CAP\u PROP\

我正在用Python和OpenCV制作一个视频编辑器,并测试不同的编解码器和文件格式组合。对于这个例子,我主要关注
avi
mp4
格式。我尝试了多个不同的四字符编解码器(),它们都保存了一部我可以播放的电影

令人困惑的是,当我重新加载它们并从电影中提取编解码器时,发现只有保存为
avi
的电影似乎是使用原始编解码器保存的。下面的图表显示了用于编码的编解码器(使用
cv2.VideoWriter\u fourcc()
创建),然后是加载后从视频中提取的相应编解码器(使用
get(cv2.CAP\u PROP\u fourcc)
)。我还将大小以MB为单位放在括号中

对于avi(编码->提取):

对于mp4:

MJPG -> mp4v (3.9)
FFV1 -> avc1 (26.1)
DIVX -> mp4v (0.7)
因此,您可以看到编码与mp4文件类型不匹配,即使文件大小大致匹配。avi和mp4的视频看起来几乎一样


加载的电影中的元数据对mp4不可信,编码对mp4不起作用,因此它选择了默认值,还是其他什么?

最可能的情况是您尝试使用编解码器(视频内容如何压缩)和容器(用于传输压缩视频的实际文件格式)的组合(通常是音频、子主题等)不兼容。

最可能的情况是您尝试使用编解码器(视频内容的压缩方式)和容器(用于传输压缩视频(通常是音频、子主题等)的实际文件格式)的组合这是不兼容的。

我起初认为这是不同的问题,但我的理解是,不同的编解码器应该与大量容器保持一致()。有趣的是,当我尝试使用
AVC1
保存时(或
AVC1
)作为四字符编解码器,它对两种文件格式都不起作用。根据您执行opencv的机器,似乎使用了不同的压缩后端。您是否安装了FFMPEF?它在后端使用
ffmpeg
。然后我会做的是“播放”使用ffmpeg命令行参数查看这些组合是否有效。如果是,则问题可能在于opencv对ffmpeg的使用。然后查看opencv代码本身或引发opencv错误是一个很好的方法。是的,这正是我所做的--在我的问题中查看我的播放结果。我们现在是否要递归:)我的问题更多的是为什么事情会这样:我在问题的最后一段列出了一些可能性,我很好奇是否有人知道。我起初认为这一点,但我的理解是这些是不同的问题,不同的编解码器应该与广泛的容器一致()。有趣的是,当我尝试使用
AVC1
(或
AVC1
)保存时作为四字符编解码器,它对两种文件格式都不起作用。根据您执行opencv的机器,似乎使用了不同的压缩后端。您是否安装了FFMPEF?它在后端使用
ffmpeg
。然后我会做的是“播放”使用ffmpeg命令行参数查看这些组合是否有效。如果是,则问题可能在于opencv对ffmpeg的使用。然后查看opencv代码本身或引发opencv错误是一个很好的方法。是的,这正是我所做的--在我的问题中查看我的播放结果。我们现在是否要递归:)我的问题更多的是为什么事情会这样:我在问题的最后一段列出了一些可能性,我很好奇是否有人知道。
MJPG -> mp4v (3.9)
FFV1 -> avc1 (26.1)
DIVX -> mp4v (0.7)