Python将多个视频帧组合成.mp4视频

已经有很多文章描述了如何将视频拆分成视频帧,例如:https://blog.csdn.net/WYKB_Mr_Q/article/details/124929081

那我们如何将很多视频帧重新组合成视频呢?

这里我们主要用到了 OpenCV 库中的 VideoWriter 类。

OpenCV种的 cv2.VideoWriter 类可以将图片序列保存成视频文件,也可以修改视频的各种属性,还可以完成对视频类型的转换。该类种常用的函数包括:构造函数、write 函数等。

1、构造函数
OpenCV中的cv2.Video_fourcc()用来指定视频编码格式:

fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # MP4格式

上述代码指定视频写入器的格式为 .mp4 格式。需要注意到’mp4v’中的英文字母,要么全大写,要么全小写。
保存为其它视频参考格式如下:

支持avi格式:

I420,YUV编码,视频格式为.avi
PIM1,MPEG-1编码,视频格式为.avi
XVID,MPEG-4编码,视频格式为.avi

其他编码器

THEO,Ogg Vorbis,视频格式为.ogv
FLV1,Flash视频,视频格式为.flv
AVC1,H264编码
DIV3,MPEG-4.3编码
DIVX,MPEG-4编码
MP42,MPEG-4.2编码
MJPG,motion-jpeg编码
U263,H263编码
I263,H263I编码

设置完视频写入格式之后,需要完成对象创建,比如设置视频的帧率,视频帧的长和宽等参数。这里我们主要用到了cv2.VideoWriter()函数。

 videowrite = cv2.VideoWriter(save_video_path, fourcc, fps=15, frameSize=(w, h)) 

其中,save_video_path参数表示合成之后视频保存的路径及名称;fourcc表示上述编码格式;fps就是帧率,即每秒播放多少张图片;frameSize表示保存视频的宽和高。

2、write函数
cv2.VideoWriter.write()用于写入下一帧视频。

videowrite.write(img)

其中,img表示读取到的视频帧数据。

3、释放
释放该类对象时所使用的是函数cv2.VideoWriter.release()。该函数的语法格式是:

videowrite.release()

在制作视频时,不用这个也没关系。

下面是完整的代码:

import cv2
import os


# 视频帧放置的文件夹路径,假如有多组视频帧,在frames文件夹下可放置多个文件夹
frame_path = r"E:\data\frames"
# 生成视频存放的文件夹路径
video_path = r"E:\datas\videos"

for root, dirs, files in os.walk(frame_path):
    # 一个文件夹中的第几个视频帧
    i = 0
    for file in files:
        # 读取图像的地址
        img_path = os.path.join(root, file)
        img = cv2.imread(img_path)
        h, w, c = img.shape

        i += 1
        # 如果是第一个视频帧,则构造视频对象
        if i == 1:
            # 保存视频的地址
            dir_lis = root.split("\\")
            save_videos_path = os.path.join(video_path, dir_lis[-3], dir_lis[-2])
            # 如果路径不存在,则创建文件夹
            if not os.path.exists(save_videos_path):
                os.makedirs(save_videos_path)

            # 加入文件名
            save_video_path = os.path.join(save_videos_path, dir_lis[-1] + '.mp4')
            # 设置视频写入器
            fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # MP4格式
            # 完成写入对象的创建,第一个参数是合成之后的视频的名称,第二个参数是可以使用的编码器,第三个参数是帧率即每秒钟展示多少张图片,第四个参数是图片大小信息
            videowrite = cv2.VideoWriter(save_video_path, fourcc, fps=15, frameSize=(w, h))  # 2是每秒的帧数,size是图片尺寸
		# 将视频帧写入视频对象中
        videowrite.write(img)
        print("第{}张图像合成成功".format(i))

    print('------done!!!------')

参考链接:https://zhuanlan.zhihu.com/p/399689868

日常学习记录,一起交流讨论吧!侵权联系~

你可能感兴趣的:(日常记录,python,音视频,开发语言)