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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WYKB_Mr_Q

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

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

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

打赏作者

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

抵扣说明:

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

余额充值