「Python|场景案例」如何拼接、裁剪、多轨合并两个或多个视频

news/2023/6/6 3:33:30

本文主要介绍如何使用python的第三方库moviepy进行简单的视频编辑操作,比如: 拼接,裁剪,多轨合并。

文章目录

  • 场景描述
  • 准备工作
  • 解决方案
  • 重点参数说明
  • 源代码

场景描述

我们可以日常可以会有一些剪辑视频的需求,最常见的就是在上传视频平台前的视频剪辑。常见的剪辑需求会有:

  • 截取/裁剪:截取视频的某一个部分作为输出视频。
  • 拼接:将两个或多个视频首尾拼接,得到一个时间更长的视频。
  • 合并音轨:将一个或多个视频的声音合并到某个视频中,或者是在某个视频的某个时间节点插入其他视频的声音/音轨,比如乐器合奏视频。

准备工作

python中有强大的音视频编辑库ffmpeg,但是使用起来会比较复杂。如果我们需求比较简单(比如上面说的截取、拼接和音轨合并),我们可以使用封装了ffmpeg的另一个第三方库moviepy

所以,我们需要安装ffmpeg(moviepy需要使用),moviepy两个库,

  • ffmpeg可以在官网安装,并且将安装磁盘:\安装目录\ffmpeg\bin放到系统环境变量中(Win键+S然后搜索"编辑系统环境变量")
  • moviepy可以通过pip命令安装:pip install moviepy

解决方案

我们需要的操作在moviepy中都已经有对应的API,直接查看moviepy官方文档,然后调用对应的API即可,如下:

  • 导入视频:clip = VideoFileClip("D:/文件路径.mp4")
  • 导入音频(音频文件或视频文件的音轨):
    • audio_1 = AudioFileClip("D:/文件路径.mp4")
    • audio_2 = AudioFileClip("D:/文件路径.mp3")
  • 截取:video_clip_1 = clip.subclip(要截取的起始时间, 要截取的结束时间)
  • 合并:concated_video = concatenate_videoclips([video_clip_1, video_clip_2])
  • 直接合并两个视频的音轨:mixed_audio = CompositeAudioClip([video_clip_1.audio, audio_1, audio_2])
  • 在音轨的第n秒插入某个音频/音轨:mixed_audio = CompositeAudioClip([audio_1, audio_2.set_start(n)])
  • 将合并的音轨作为视频的音轨:concated_video = concated_video.set_audio(mixed_audio)
  • 导出视频:concated_video.write_videofile(output_filepath)

重点参数说明

导出视频文件的.write_videofile方法的具体参数如下:

write_videofile(self,filename,fps=None,codec=None,bitrate=None,audio=True,audio_fps=44100,preset='medium',audio_nbytes=4,audio_codec=None,audio_bitrate=None,audio_bufsize=2000,temp_audiofile=None,rewrite_audio=True,remove_temp=True,write_logfile=False,verbose=True,threads=None,ffmpeg_params=None,logger='bar',
)

以下是对部分常用参数的说明:

参数名称参数作用
filename导出的视频文件路径
fps导出视频的帧率(每秒多少帧),默认值是None,会使用原视频的帧率
codec视频的编码方式,会影响到画质,对于mp4,默认使用libx264,如果要提升mp4的画质可以传入mpeg4.avi要提高画质可以传入png
audio输出的视频是否要有音频,False为不需要,True会输出我们插入视频中的音轨(如果我们没有处理会使用视频原有的音轨);如果是一个代表音频文件路径的字符串,则会将该音频文件作为输出视频的音频
audio_codec音频编码方式,如果是导出的音频没有声音,比如windows上没有声音或者是windows上有声音但是Mac或者ios上没有声音,则可以考虑指定该参数为aac
audiofps音频的码率,更多的码率可以得到更高音质的输出视频,但是视频的大小会更大,导出速度自然也会更慢

源代码

from moviepy.editor import *"""导入我们未处理的原始视频"""
raw_video_1 = VideoFileClip("D:/Downloads/video_1.mp4")
raw_video_2 = VideoFileClip("D:/Downloads/video_2.mp4")"""
裁剪视频
第一个视频截取从第7秒到70秒
第二个视频截取从第10秒到30秒
"""
cutted_video_1 = raw_video_1.subclip(7, 70)
cutted_video_2 = raw_video_2.subclip(10, 30)"""将第二个视频接在第一个视频后面, 生成最终的视频"""
concated_video = concatenate_videoclips([cutted_video_1, cutted_video_2])"""在合成视频原有的音频上, 在视频的第2秒的时候加上一段音频/背景音乐"""
audio_to_add = AudioFileClip("D:/Downloads/audio_to_add.mp4")
mix_audio = CompositeAudioClip([concated_video.audio, audio_to_add.set_start(2)])
concated_video.set_audio(mix_audio)"""导出视频"""
concated_video.write_videofile("D:/output/final_video.mp4")

快去试试吧,有任何问题可以在评论区留言~

写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4574809.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

ladder教程

1.买账号 网址: https://ikuuu.co/user 2.下载软件 3.打开软件–>从网站中导入信息 4.查看是否导入进来 比如 5.打开代理 并且选择相应的代理服务

ikuuu clash无法导入配置文件

本人因为粗心,按照官方教程无法一键导进去配置文件,没有看到ikuuu.yaml文件 解决方法:记得先关闭系统代理,然后再导入配置文件

死活打不开github网站

参考https://blog.csdn.net/cpongo3/article/details/93854117 有用,神奇啊 C:\Windows\System32\drivers\etc\hosts

webpack-dev-server 安装中出现的问题

webpack-dev-server 依赖于webpack,所以安装的时候对webpack和webpack-cli版本有一定要求 1, cnpm i webpack-dev-server -D 2, 查看warning提示,指定的webpack版本进行安装 cnpm i webpackXXXX -D 3, 在 webpack.json…

telegrame机器人爬坑

爬坑1.首先你的电脑能f墙 可以使用ikuuu 详情度娘去2.去注册telegrame账户 有的人收不到短信 可能是手机号没有开通国际漫游3.登录后 搜索 botfather 这是所有机器人的老大 /newbot按照提示去申请机器人就好了 然后获得api_id和api_hash 然后获取token 具体度娘4.获得后就可以进…

从URL下载文件的方法

2019独角兽企业重金招聘Python工程师标准>>> import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL;…

LINUX的基本使用(1)

创建用户、用户间切换、设置主机名称及常用命令 : 表示当前用户属于root用户,超级管理员用户 需要对系统进行配置时,使用该用户 $:表示用户属于普通用户 查看ip地址的命令: ifconfig,如图所示 清理屏幕:# clear 创建用户:# useradd b…

IO:open/read/write/close等文件相关系统调用接口

标准库IO接口: fopen fseek fwrite fread close fprintf sprintf snprintf printf fgets fopen (file, “r r w w a a”); r: 若文件存在则以只读方式打开.不存在报错 r: 若文件存在则以只读写方式打开,不存在报错 w: 若文件不存在则创建,否则清空原有内容,以只写打开. w : 若…