Python_OpenCv--实现视频的剪切、图片合成视频。

随意分享一下,最近几个月写的东西未来的急分享,当然我在 博客园账号 分享了些许东西,这里就不提博客园账号了,今天分享一个OpenCv的小知识,就是剪切视频,最初目的是帮助朋友剪切视频,网上大多数软件要么恶意连接下载,要么用几次就不让用了。今天分享一下吧。

一:视频的剪切

# @description:任意剪切视频方法的实现。
"""
关于网上好多人写的视频的剪切,为什么好多人复制代码,却发现剪切出来的视频是 0kb或者6kb可能原因之一:那是因为代码的作者忘了写一点,就是原视频
的图片的高度和宽度一定要和写入的保持一致[个人理解,不喜勿喷]也就是:
        f_height = f_shape[0]  # 原视频图片的高度
        f_width = f_shape[1]  # 代码中这点比较重要。
        video_writer = cv2.VideoWriter(save_path, four_cc, fps, (int(f_width), int(f_height)))
"""

import os
import cv2
import math


def read_video():
    """
    获取到输入的视频路径,并建立保存的路径。
    :return:
    """
    video_path = input(r'请输入视频的路径[eg:D:\Video\66.mp4]:')
    all_info = video_path.split('\\')
    file_name = all_info[-1].split('.')[0]
    save_path = '\\'.join(all_info[:-1]) + '\\data' + '\\' + file_name + '.avi'
    try:
        if not os.path.exists(save_path):
            os.mkdir('\\'.join(all_info[:-1]) + '\\data')
    except FileExistsError as e:
        print(u'保存路径已经创建......')
    return video_path, save_path


def clip_video():
    """
    对视频任意时间段进行剪切
    :return:
    """
    video_path, save_path = read_video()
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        print('video is not opened')
    else:
        success, frame = cap.read()
        f_shape = frame.shape
        f_height = f_shape[0]  # 原视频图片的高度
        f_width = f_shape[1]
        fps = cap.get(5)  # 帧速率
        frame_number = cap.get(7)  # 视频文件的帧数
        duration = frame_number / fps  # 视频总帧数/帧速率 是时间/秒【总共有多少秒的视频时间】
        print('请注意视频的总时间长度为 %s 秒' % str(duration))
        start = input('请输入开始时间/秒为单位 例如输入:0[代表从第 0 秒开始剪切]:')
        while True:
            if int(start) > int(math.ceil(duration)):
                start = input('输入结束时间大于总视频时间请重新输入......时间:')
            else:
                break
        start_time = fps * float(start)
        end = input('请输入结束时间/秒为单位 例如输入:10[代表到第 10 秒结束剪切]')
        while True:
            if int(end) > int(math.ceil(duration)):
                end = input('输入结束时间大于总视频时间请重新输入......时间:')
            else:
                break
        end_time = fps * float(end)
        # AVI格式编码输出 XVID
        four_cc = cv2.VideoWriter_fourcc(*'XVID')
        video_writer = cv2.VideoWriter(save_path, four_cc, fps, (int(f_width), int(f_height)))
        num = 0
        while True:
            success, frame = cap.read()
            if int(start_time) <= int(num) <= int(end_time):
                if success:
                    video_writer.write(frame)
                else:
                    break
            num += 1
            if num > frame_number:
                break
        cap.release()


if __name__ == '__main__':
    clip_video()

你可以打包成exe分享给你的朋友,当然如果你用了作者的别忘了点赞哟。

二:图片合成视频的代码一并分享在这

# @description:把照片合成视频。

import os
import cv2
import uuid


def read_picture():
    path = input('请输入视频的路径[eg:D:\Image\BaiDuImgDownLoad\liuhai]: ')
    file_list = os.listdir(path)

    fps = input('请输入视频的帧速率,秒为单位,一秒播放多少张照片:')  # 视频每秒2帧
    height = input('请输入视频图片尺寸的高度,视频的高清程序')
    weight = input('请输入视频图片尺寸的宽度,视频的高清程序')
    size = (int(height), int(weight))  # 需要转为视频的图片的尺寸
    return [path, fps, size, file_list]


def write_video():
    path, fps, size, file_list = read_picture()
    # AVI格式编码输出 XVID
    four_cc = cv2.VideoWriter_fourcc(*'XVID')
    save_path = path + '\\' + '%s.avi' % str(uuid.uuid1())
    video_writer = cv2.VideoWriter(save_path, four_cc, float(fps), size)
    # 视频保存在当前目录下
    for item in file_list:
        if item.endswith('.jpg') or item.endswith('.png'):
            # 找到路径中所有后缀名为.png的文件,可以更换为.jpg或其它
            item = path + '\\' + item
            img = cv2.imread(item)
            re_pics = cv2.resize(img, size, interpolation=cv2.INTER_CUBIC)  # 定尺寸
            if re_pics:
                video_writer.write(re_pics)

    video_writer.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    write_video()

#  如果想加背景音乐可以在此代码的基础上添加,如果你不会可以联系作者哟。

当然如果想把视频每一帧给保存成图片也很简单,网上的教程也很简单,如果后续作者写了关于这部分的代码会分享上去的哈。

猜你喜欢

转载自blog.csdn.net/weixin_42812527/article/details/89234982