opencv图片转换视频文件时的编码问题总结

在进行图片转视频文件时遇到的主要报错类型有一下三种情况:

case1:
OpenCV: FFMPEG: tag 0x5634504d/‘MP4V’ is not supported with codec id 13 and format ‘mp4 / MP4 (MPEG-4 Part 14)’
OpenCV: FFMPEG: fallback to use tag 0x00000020/’ ???

case2:
OpenCV: FFMPEG: tag 0x5634504d/‘MP4V’ is not supported with codec id 13 and format ‘avi / AVI (Audio Video Interleaved)’
OpenCV: FFMPEG: fallback to use tag 0x34504d46/‘FMP4’

case3:
OpenCV: FFMPEG: tag 0x47504a4d/‘MJPG’ is not supported with codec id 8 and format ‘mp4 / MP4 (MPEG-4 Part 14)’
OpenCV: FFMPEG: fallback to use tag 0x0000006c/‘l???’

导致上面报错类型的原因是合成视频时,编码类型错误

常用的视频编解码参数如下,根据实际情况选择使用合适的参数:

#cv2.VideoWriter_fourcc('X', '2', '6', '4'), 该参数是较新的MPEG-4编码,产生的文件较小,文件扩展名应为.mp4
#cv2.VideoWriter_fourcc('P', 'I', 'M', 'I'), 该参数是较旧的MPEG-1编码,文件名后缀为.avi
#cv2.VideoWriter_fourcc('M', 'P', '4', '2'), 该参数是MPEG-2编码,产生的文件不会特别大,文件名后缀为.avi
#cv2.VideoWriter_fourcc('D', 'I', 'V', '3'), 该参数是MPEG-3编码,产生的文件不会特别大,文件名后缀为.avi
#cv2.VideoWriter_fourcc('D', 'I', 'V', 'X'), 该参数是MPEG-4编码,产生的文件不会特别大,文件名后缀为.avi
#cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), 该参数是较旧的MPEG-4编码,产生的文件不会特别大,文件名后缀为.avi
#cv2.VideoWriter_fourcc('M', 'P', '4', 'V'), 该参数也是较旧的MPEG-4编码,产生的文件不会特别大,文件扩展名应为.m4v
#cv2.VideoWriter_fourcc('T', 'H', 'E', 'O'), 该参数是Ogg Vorbis,产生的文件相对较大,文件名后缀为.ogv
#cv2.VideoWriter_fourcc('F', 'L', 'V', '1'), 该参数是Flash视频,产生的文件相对较大,文件名后缀为.flv
#cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 该参数是motion-jpeg编码,产生的文件较大,文件名后缀为.avi
#cv2.VideoWriter_fourcc('I', '4', '2', '0'),该参数是未压缩的YUV编码,4:2:0色度子采样,这种编码广泛兼容,但会产生特别大的文件,文件扩展名应为.avi ```

这里测试了原始视频大小为48M,转换后视频大小如下图所示:
在这里插入图片描述

案例如下

情况一:

import cv2
video_dir = "./videos/test.mp4"
save_dir  = "./test_videos/"
video = cv2.VideoCapture(video_dir)
images_list = []
while video.isOpened():
    ret, frame = video.read()
    if frame is None:
        break
    ...
    ...
    ...

    images_list.append(frame)
    
cap = cv2.VideoCapture(video_dir)
fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
frame_counter = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 总帧数
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
//或者改为
//fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')
save_video_dir = save_dir + video_dir.split('/')[-1] 
img_size = (1280,720)
videoWriter = cv2.VideoWriter(save_video_dir, fourcc, fps, img_size, isColor=True)
for i in range(1, frame_counter):
    videoWriter.write(images_list[i])
    
videoWriter.release()

视频保存格式为.mp4
会报如下错误,在所有图片没有完全保存为视频文件时,视频文件不可以正常播放,所有图片完全保存为视频文件后可以正常播放

OpenCV: FFMPEG: tag 0x5634504d/‘MP4V’ is not supported with codec id 13 and format ‘mp4 / MP4 (MPEG-4 Part 14)’
OpenCV: FFMPEG: fallback to use tag 0x00000020/’ ???

情况二:
如果报上面代码改为:

import cv2
video_dir = "./videos/test.mp4"
save_dir  = "./test_videos/"
video = cv2.VideoCapture(video_dir)
images_list = []
while video.isOpened():
    ret, frame = video.read()
    if frame is None:
        break
    ...
    ...
    ...

    images_list.append(frame)
cap = cv2.VideoCapture(video_dir)
fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
frame_counter = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 总帧数
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
save_video_dir = save_dir + video_dir.split('/')[-1].split(".")[0] + '.avi
img_size = (1280,720)
videoWriter = cv2.VideoWriter(save_video_dir, fourcc, fps, img_size, isColor=True)
for i in range(1, frame_counter):
    videoWriter.write(images_list[i])

videoWriter.release()

视频保存格式为.avi
会报如下错误,但是在所有图片没有完全保存为视频文件时,就可以正常播放,所有图片完全保存为视频文件后也可以正常播放OpenCV: FFMPEG: tag 0x5634504d/‘MP4V’ is not supported with codec id 13 and format ‘avi / AVI (Audio Video Interleaved)’
OpenCV: FFMPEG: fallback to use tag 0x34504d46/‘FMP4’

情况三:
如果报上面代码改为:

import cv2
video_dir = "./videos/test.mp4"
save_dir  = "./test_videos/"
video = cv2.VideoCapture(video_dir)
images_list = []
while video.isOpened():
    ret, frame = video.read()
    if frame is None:
        break
    ...
    ...
    ...

    images_list.append(frame)
cap = cv2.VideoCapture(video_dir)
fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
frame_counter = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 总帧数
fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
save_video_dir = save_dir + video_dir.split('/')[-1]
img_size = (1280,720)
videoWriter = cv2.VideoWriter(save_video_dir, fourcc, fps, img_size, isColor=True)
for i in range(1, frame_counter):
    videoWriter.write(images_list[i])

videoWriter.release()

视频保存格式为.mp4
会报如下错误,在所有图片没有完全保存为视频文件时,视频文件不可以正常播放,所有图片完全保存为视频文件后可以正常播放

OpenCV: FFMPEG: tag 0x47504a4d/‘MJPG’ is not supported with codec id 8 and format ‘mp4 / MP4 (MPEG-4 Part 14)’
OpenCV: FFMPEG: fallback to use tag 0x0000006c/‘l???’

情况四:
如果报上面代码改为:

import cv2
video_dir = "./videos/test.mp4"
save_dir  = "./test_videos/"
video = cv2.VideoCapture(video_dir)
images_list = []
while video.isOpened():
    ret, frame = video.read()
    if frame is None:
        break
    ...
    ...
    ...

    images_list.append(frame)
    
cap = cv2.VideoCapture(video_dir)
fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
frame_counter = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 总帧数
fourcc = 0x00000021
save_video_dir = save_dir + video_dir.split('/')[-1]
img_size = (1280,720)
videoWriter = cv2.VideoWriter(save_video_dir, fourcc, fps, img_size, isColor=True)
for i in range(1, frame_counter):
    videoWriter.write(images_list[i])

videoWriter.release()

视频保存格式为.mp4
不会报错,在所有图片没有完全保存为视频文件时,视频文件不可以正常播放,所有图片完全保存为视频文件后可以正常播放

情况五:
如果报上面代码改为:

import cv2
video_dir = "./videos/test.mp4"
save_dir  = "./test_videos/"
video = cv2.VideoCapture(video_dir)
images_list = []
while video.isOpened():
    ret, frame = video.read()
    if frame is None:
        break
    ...
    ...
    ...

    images_list.append(frame)
    
cap = cv2.VideoCapture(video_dir)
fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
frame_counter = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 总帧数
fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
//或者改为
//fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')
save_video_dir = save_dir + video_dir.split('/')[-1].split(".")[0] + '.avi
img_size = (1280,720)
videoWriter = cv2.VideoWriter(save_video_dir, fourcc, fps, img_size, isColor=True)
for i in range(1, frame_counter):
    videoWriter.write(images_list[i])

videoWriter.release()

视频保存格式为.avi
代码不会报错,在所有图片没有完全保存为视频文件时,就可以正常播放,所有图片完全保存为视频文件后也可以正常播放

图片直接转视频文件

# import cv2, os
# image_dir = "./test_images/"
# save_dir  = "./test_videos/"
# file_list = os.listdir(image_dir)
# fps = 25
# fourcc = cv2.VideoWriter_fourcc('X', '2', '6', '4')
# save_video_dir = save_dir + "video"+ '.avi'
# img_size = (1280,720)
# videoWriter = cv2.VideoWriter(save_video_dir, fourcc, fps, img_size,isColor=True)
#
# for img in file_list:
#     videoWriter.write(cv2.imread(os.path.join(image_dir, img)))
#
# videoWriter.release()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风华正茂6666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值