当前位置: 首页 > news >正文

Python常用视频编辑操作——读取与保存视频、更改帧数、拼接视频、视频语音合并、视频与图像互转等

1.更改视频帧数

降低视频帧数,简单的操作只能降低视频帧数,如果要增加视频帧数,那就要使用深度学习进行插帧处理:

import cv2
from moviepy.editor import *
def change_fps(inpt_path,output_path,fps):
    # 加载视频
    video = VideoFileClip(inpt_path)

    # 将帧率降低为15帧/秒
    new_video = video.set_fps(fps)

    # 保存为新的文件
    new_video.write_videofile(output_path, codec="libx264")

def change_fps_dir(video_dir,fps):
    file_list = os.listdir(video_dir)

    for file in file_list:
        # 使用os.path.basename()获取文件名(包括后缀)
        file_name = os.path.basename(file)
        out_name = "F" + file_name

        input = os.path.join(video_dir,file_name)
        output = os.path.join(video_dir,out_name)

        change_fps(input,output,fps)

2.把视频拆分成帧保存

def split_video(video_path,save_path):
    # 创建输出目录
    os.makedirs(save_path, exist_ok=True)

    # 打开视频文件
    cap = cv2.VideoCapture(video_path)

    frame_count = 0

    # 读取视频帧并保存为图像
    while True:
        ret, frame = cap.read()

        if not ret:
            break

        # 生成输出图像文件名
        frame_filename = os.path.join(save_path, f'{frame_count:05d}.jpg')

        frame_count += 1

        # 保存帧图像
        cv2.imwrite(frame_filename, frame)

    # 释放视频文件
    cap.release()

    print(f"总共保存了 {frame_count} 帧图像")

3.把拆分图像合成视频

def img_video_merge(img_dir,video_path,frame_rate):
    file_list = os.listdir(img_dir)
    cv_src = cv2.imread(os.path.join(img_dir,file_list[0]))

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 使用H.264编解码器

    height, width, channels = cv_src.shape

    # 帧速率和帧大小
    frame_size = (width, height)
    # 创建VideoWriter对象
    out = cv2.VideoWriter(video_path, fourcc, frame_rate, frame_size)

    for file in file_list:
        cv_dst = cv2.imread(os.path.join(img_dir, file))
        out.write(cv_dst)

4.提取视频的音轨

def video_to_audio(video_path,audio_path):
    video = VideoFileClip(video_path)
    audio = video.audio
    audio_temp = "temp.wav"

    if os.path.exists(audio_path):
        os.remove(audio_temp)

    audio.write_audiofile(audio_temp)
    audio.close()

    if os.path.exists(audio_path):
        os.remove(audio_path)
    cmd = "ffmpeg -i " + audio_temp + " -ac 1 -ar 16000 " + audio_path
    subprocess.run(cmd,shell=True)

5.视频与音轨合并

from moviepy.editor import VideoFileClip, AudioFileClip

# 读取视频和音轨
video_clip = VideoFileClip('video.mp4')  # 替换为您的视频文件
audio_clip = AudioFileClip('audio.mp3')  # 替换为您的音轨文件

# 将音轨添加到视频
video_clip = video_clip.set_audio(audio_clip)

# 保存合并后的视频
output_video_path = 'output_video.mp4'
video_clip.write_videofile(output_video_path, codec='libx264')

# 关闭视频和音轨文件
video_clip.close()
audio_clip.close()

print(f"已将音轨成功合并到视频并保存为 {output_video_path}")

6.视频合并

def image_stitching(images,stack):
    height, width, channels = images[0].shape
    # 遍历所有图像,如果尺寸不同,将它们调整为相同的尺寸
    for i in range(1, len(images)):
        if images[i].shape != (height, width, channels):
            images[i] = cv2.resize(images[i], (width, height))
    if stack == 0:
        result = np.hstack(images)
    else:
        result = np.vstack(images)

    return result

#stack为0是水平合并,等于1是垂直合并
def video_stitching(video_path_1,video_path_2,output_path,stack):
    cap1 = cv2.VideoCapture(video_path_1)
    cap2 = cv2.VideoCapture(video_path_2)

    if stack == 0:
        frame_width = int(cap1.get(3)) * 2
        frame_height = int(cap1.get(4))
    elif stack == 1:
        frame_width = int(cap1.get(3))
        frame_height = int(cap1.get(4)) * 2

    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')

    out = cv2.VideoWriter(output_path, fourcc, 25, (frame_width, frame_height))

    while (True):
        ret1, frame1 = cap1.read()
        ret2, frame2 = cap2.read()
        if ret1 and ret2 == True:
            images = [frame1, frame2]
            dst = image_stitching(images,stack)
            out.write(dst)
        else:
            break
    cap1.release()
    cap2.release()
    out.release()

相关文章:

  • 【学习笔记】RabbitMQ04:延迟队列的原理以及实现代码
  • ChatGPT AutoExpert:通过自定义指令,增强 GPT-4 和 GPT-3.5-Turbo 对话模型的功能
  • 28栈与队列-单调队列
  • Element UI打开表单自动验证问题的解决
  • 怎么把flac音频变为mp3?
  • 微信小程序使用本地存储方法
  • 【yolov5目标检测】使用yolov5训练自己的训练集
  • 小程序原生代码转uniapp
  • C++对象模型(13)-- 构造函数语义学:析构函数
  • Hadoop3教程(三):HDFS文件系统常用命令一览
  • 基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习高级应用
  • IDEA如何设置项目包名分级
  • 面试题:将 Bean 放入 Spring 容器中的方式有哪些 ?
  • (完全解决)latex如何设置某段文字向右对齐
  • HarmonyOS学习 -- ArkTS开发语言入门
  • Qt Creator编译含opencv的程序时报错libopencv_calib3d.so:-1: error: error adding symbols
  • 部署k8s dashboard(这里使用Kubepi)
  • A Close Look into the Calibration of Pre-trained Language Models
  • 解决js return返回结果依赖耗时操作而返回空值或undefined问题
  • 云计算是什么?学习云计算能做什么工作?
  • 何立峰将访问瑞士、法国并举行中美经贸高层会谈、第十次中法高级别经济财金对话
  • 言短意长|党政主官如何塑造流量城市?
  • 虚构医药服务项目、协助冒名就医等,北京4家医疗机构被处罚
  • 新闻1+1丨多地政府食堂开放“舌尖上的服务”,反映出怎样的理念转变?
  • 央视热评:从银幕到生活,好故事如何“撬动”大市场
  • 贵州黔西游船发生侧翻事故,游客:事发时能见度只有一米,所乘船只停靠礁石避险