Python多个MP4合成视频的实现方法


Posted in Python onJuly 16, 2021

开始安装使用

主要是利用 moviepy 这个库, 里面提供了丰富的功能, 我们只需要使用简单的拼接函数

一、安装 Python

这个就不多说了, 直接去官网下载对应的安装包: https://www.python.org/downloads/release/python-364/
然后双击运行,记得点 Add to Path 然后,一路 next

二、安装 moviepy

命令行执行:

pip install moviepy

三、安装 ffmpeg

我们先使用如下命令来尝试安装:

pip install ffmpeg
pip install imageio-ffmpeg

把以上代码保存为 xx.py , 然后在相同目录执行命令:

python3 xx.py

如安装不成功,可以试一试以下操作:

如果之前没安装过 ffmpeg , 这个时候导入 moviepy 开始使用会报错的, 所以我们可以先用 imageio 自带的方法下载 ffmpeg
新建文本文件:

import imageio
import ssl

# 下面这一句不是必须的, 但是某些情况下访问 https 会报SSL证书不受信任, 加上这一句可以允许通过
ssl._create_default_https_context = ssl._create_unverified_context

# 下载 ffmpeg 组件
imageio.plugins.ffmpeg.download()

四、开始写拼接脚本

# 主要是需要moviepy这个库
from moviepy.editor import *
import os

# 定义一个数组
L = []

# 访问 video 文件夹 (假设视频都放在这里面)
for root, dirs, files in os.walk("./video"):
    # 按文件名排序
    files.sort()
    # 遍历所有文件
    for file in files:
        # 如果后缀名为 .mp4
        if os.path.splitext(file)[1] == '.mp4':
            # 拼接成完整路径
            filePath = os.path.join(root, file)
            # 载入视频
            video = VideoFileClip(filePath)
            # 添加到数组
            L.append(video)

# 拼接视频
final_clip = concatenate_videoclips(L)

# 生成目标视频文件
final_clip.to_videofile("./target.mp4", fps=24, remove_temp=False)

把上面代码的 源文件夹 和 目标文件名 改成你自己需要的, 然后把以上代码保存为 concatenate.py 文件, 然后在相同目录执行命令:

python3 concatenate.py

五、等待运行完毕, 完结撒花 ?

等待输出走到 100% , 视频就合并好了。

Moviepy - Building video ./target.mp4.
MoviePy - Writing audio in targetTEMP_MPY_wvf_snd.mp3
MoviePy - Done.
Moviepy - Writing video ./target.mp4

Moviepy - Done !
Moviepy - video ready ./target.mp4

其实 moviepy 还有很多方便的方法, 比如截取视频:

video = VideoFileClip("xxoo.mp4")

# 剪辑视频,截取视频前20秒
video = video.subclip(0,20)

# 剪辑视频,从10秒开始到视频结尾前12秒
video = video.subclip(10, video.duration-12)

六、补充内容

上面的拼接代码实际上有点小问题, files.sort()把文件排序,实际上排出来的结果是不符合我们正常思维的,比如: 1.mp4, 10.mp4, 2.mp4。因为他是从前往后逐字符比较的,而我们想要的结果一般是: 1.mp4, 2.mp4, 10.mp4。这个问题除了自己写各种逻辑代码来处理,也可以直接用一个第三方库: natsort,这个库提供了优秀的自然排序方法。

安装 natsort:

pip3 install natsort

使用:

  • 导入库: from natsort import natsorted
  • 把代码 files.sort() 替换为 files = natsorted(files)

代码如下:

"""
project = 'Code', file_name = 'Video_stitching', author = 'AI悦创'
time = '2020/4/25 12:19', product_name = PyCharm, 公众号:AI悦创
# code is far away from bugs with the god animal protecting
    I love animals. They taste delicious.
"""
# 主要是需要moviepy这个库
from moviepy.editor import *
from natsort import natsorted
import os

# 定义一个数组
L = []

# 访问 video 文件夹 (假设视频都放在这里面)
for root, dirs, files in os.walk("./video"):
    # 按文件名排序
    # files.sort()
    files = natsorted(files)
    # 遍历所有文件
    for file in files:
        # 如果后缀名为 .mp4
        if os.path.splitext(file)[1] == '.mp4':
            # 拼接成完整路径
            filePath = os.path.join(root, file)
            # 载入视频
            video = VideoFileClip(filePath)
            # 添加到数组
            L.append(video)

# 拼接视频
final_clip = concatenate_videoclips(L)

# 生成目标视频文件
final_clip.to_videofile("./target.mp4", fps=24, remove_temp=False)

这样的成功我做出来 MP4 视频的拼接。

到此这篇关于Python把多个MP4合成一个视频的文章就介绍到这了,更多相关Python MP4合成视频内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python设计模式之单例模式实例
Apr 26 Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 Python
Python Requests 基础入门
Apr 07 Python
对numpy和pandas中数组的合并和拆分详解
Apr 11 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
Python3中编码与解码之Unicode与bytes的讲解
Feb 28 Python
python实现Virginia无密钥解密
Mar 20 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
python zip,lambda,map函数代码实例
Apr 04 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
python blinker 信号库
May 04 Python
Python如何解决secure_filename对中文不支持问题
利用Matlab绘制各类特殊图形的实例代码
Flask response响应的具体使用
Python 快速验证代理IP是否有效的方法实现
Jul 15 #Python
Django路由层如何获取正确的url
Jul 15 #Python
Python实现排序方法常见的四种
Jul 15 #Python
手把手教你使用TensorFlow2实现RNN
You might like
PHP 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
PHP中的extract的作用分析
2008/04/09 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
关于PHP开发的9条建议
2015/07/27 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python进程间通信Queue实例解析
2018/01/25 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
python 中如何获取列表的索引
2019/07/02 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
Servlet如何得到服务器的信息
2015/12/22 面试题
文史专业毕业生自荐信
2013/11/17 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
2014年度工作总结报告
2014/12/15 职场文书
高考升学宴答谢词
2015/01/20 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python