环境安装
pip install moviepy
使用
视频按时间剪辑
import os
print('***获取当前目录***')
print(os.getcwd())
os.chdir(r"C:\Users\min.wang\Desktop\新建文件夹 (2)")
print('***获取当前目录***')
print(os.getcwd())
# 导入需要的库
from moviepy.editor import *
# 从本地载入视频 disco.mp4 并截取 00:00:00 - 00:00:05 部分
clip = VideoFileClip("t1.mp4").subclip(0,5)
# 把生成的视频导出到文件内
clip.write_videofile("t1_2.mp4")
import time
from moviepy.editor import *
if __name__ == '__main__':
video_clip = VideoFileClip('some.mp4').subclip(10, 20)
# 截取视频全部,相当于没做处理
# video_clip = video_clip.subclip()
# 从视频的 `第10秒` 截取到 `结尾`
video_clip = video_clip.subclip(10)
# 从视频的 `第10秒` 截取到结尾的 `前两秒`
# video_clip = video_clip.subclip(10, -2)
# 从视频的 `第1分35秒` 截取到 `3分10秒`
# video_clip = video_clip.subclip((1, 35), (3, 10))
# 从视频的 `第1小时2分18秒` 截取到 `第2小时1分34秒`
# video_clip = video_clip.subclip((1, 2, 18), (2, 1, 34))
new_file = str(int(time.time())) + '_subclip.mp4'
video_clip.write_videofile(new_file)
剪辑代码运行结果
***获取当前目录***
C:\Users\min.wang\Desktop\新建文件夹 (2)
***获取当前目录***
C:\Users\min.wang\Desktop\新建文件夹 (2)
chunk: 0%| | 0/111 [00:00<?, ?it/s, now=None]
Moviepy - Building video t1_2.mp4.
MoviePy - Writing audio in t1_2TEMP_MPY_wvf_snd.mp3
t: 0%| | 0/150 [00:00<?, ?it/s, now=None]
MoviePy - Done.
Moviepy - Writing video t1_2.mp4
Moviepy - Done !
Moviepy - video ready t1_2.mp4
视频拼接
import os
print('***获取当前目录***')
print(os.getcwd())
os.chdir(r"C:\Users\min.wang\Desktop\新建文件夹 (2)")
print('***获取当前目录***')
print(os.getcwd())
from moviepy.editor import VideoFileClip, concatenate_videoclips
clip1 = VideoFileClip("t1.mp4") # 加载刚才剪辑大叔的视频
clip2 = VideoFileClip("t1.mp4") # 加载刚才剪辑小姐姐的视频
# 按照 clip 顺序进行视频拼接
finalclip = concatenate_videoclips([clip1, clip2])
finalclip.write_videofile("disco_final1.mp4") # 输出合并视频
运行结果:
***获取当前目录***
C:\Users\min.wang\Desktop\新建文件夹 (2)
***获取当前目录***
C:\Users\min.wang\Desktop\新建文件夹 (2)
chunk: 0%| | 0/286 [00:00<?, ?it/s, now=None]
Moviepy - Building video disco_final1.mp4.
MoviePy - Writing audio in disco_final1TEMP_MPY_wvf_snd.mp3
t: 0%| | 0/389 [00:00<?, ?it/s, now=None]
MoviePy - Done.
Moviepy - Writing video disco_final1.mp4
Moviepy - Done !
Moviepy - video ready disco_final1.mp4
提取视频的音频
import os
print('***获取当前目录***')
print(os.getcwd())
os.chdir(r"C:\Users\min.wang\Desktop\新建文件夹 (2)")
print('***获取当前目录***')
print(os.getcwd())
from moviepy.editor import *
video = VideoFileClip('t1.mp4')#加载视频
audio = video.audio
audio.write_audiofile('t1.mp3')#提出音频
***获取当前目录***
C:\Users\min.wang\Desktop\新建文件夹 (2)
***获取当前目录***
C:\Users\min.wang\Desktop\新建文件夹 (2)
chunk: 0%| | 0/143 [00:00<?, ?it/s, now=None]
MoviePy - Writing audio in t1.mp3
MoviePy - Done.
视频添加字幕
import os
print('***获取当前目录***')
print(os.getcwd())
os.chdir(r"C:\Users\min.wang\Desktop\新建文件夹 (2)")
print('***获取当前目录***')
print(os.getcwd())
from moviepy.editor import *
# 本地视频位置
from moviepy.video.VideoClip import TextClip
# subclip视频截取开始时间和结束时间
video = VideoFileClip("t1.mp4")
# 制作文字,指定文字大小和颜色
txt_clip = (TextClip("My Holidays 2020")
.set_position(lambda t: (150*t, 50*t)) # 随着时间移动
.set_duration(video.duration)) # 水印持续时间
result = CompositeVideoClip([video, txt_clip]) # 在视频上覆盖文本
result.write_videofile("t1.mp4", fps=25) # fps:视频文件中每秒的帧数
***获取当前目录***
C:\Users\min.wang
***获取当前目录***
C:\Users\min.wang\Desktop\新建文件夹 (2)
chunk: 0%| | 0/143 [00:00<?, ?it/s, now=None]
Moviepy - Building video t1.mp4.
MoviePy - Writing audio in t1TEMP_MPY_wvf_snd.mp3
t: 0%| | 0/162 [00:00<?, ?it/s, now=None]
MoviePy - Done.
Moviepy - Writing video t1.mp4
Moviepy - Done !
Moviepy - video ready t1.mp4
报错处理
在使用moviepy的构造方法创建实例时报错:
"C:\Program Files\Python37\python.exe" F:/study/python/project/moviepyTest/moviepyTest.py
Traceback (most recent call last):
File "C:\Program Files\Python37\lib\site-packages\moviepy\video\VideoClip.py", line 1137, in init
subprocess_call(cmd, logger=None)
File "C:\Program Files\Python37\lib\site-packages\moviepy\tools.py", line 46, in subprocess_call
proc = sp.Popen(cmd, **popen_params)
File "C:\Program Files\Python37\lib\subprocess.py", line 775, in init
restore_signals, start_new_session)
File "C:\Program Files\Python37\lib\subprocess.py", line 1178, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "F:/study/python/project/moviepyTest/moviepyTest.py", line 16, in
txtclip = TextClip(inf )
File "C:\Program Files\Python37\lib\site-packages\moviepy\video\VideoClip.py", line 1146, in init
raise IOError(error)
OSError: MoviePy Error: creation of None failed because of the following error:
[WinError 2] 系统找不到指定的文件。.
.This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) that you didn't specify the path to the ImageMagick binary in file conf.py, or that the path you specified is incorrect
Process finished with exit code 1
这可能是两个原因导致的:
未安装ImageMagick应用
ImageMagick是一套功能强大、稳定而且开源的多平台工具集和开发包,可以用来读、写和处理超过200种基本格式的图片文件,包括PNG,JPEG,GIF,HEIC,TIFF,DPX,EXR,WebP,Postscript,PDF和SVG等格式。利用ImageMagick,可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,既可以通过命令行进行,也可以通过C/C++、Perl、Java、PHP、Python或Ruby编程来完成。ImageMagic的主要精力集中在性能,减少bug以及提供稳定的API和ABI上。
ImageMagick的功能通常通过命令行使用,也可以通过编程来使用。moviepy使用的方式就是通过命令行方式调用的。因此在使用TextClip前,必须安装独立的ImageMagick应用,该应用对应官方下载地址为:
http://www.imagemagick.org/script/index.php,该网站从国内访问非常慢,老猿好不容易才弄到该工具包的windows 64位16通道图像处理的版本放在CSDN的资源服务器上,如果大家需要使用该版本可以从CSDN的资源服务器对应链接下载,下载地址为:https://download.csdn.net/download/LaoYuanPython/12539159,不过需要5个CSDN积分,但下载快,下载后解压直接点击执行文件运行即可。
安装ImageMagick没有修改moviepy的配置文件config_defaults.py
安装ImageMagick后,需要修改moviepy的config_defaults.py模块的配置,将下行代码:
IMAGEMAGICK_BINARY = os.getenv('IMAGEMAGICK_BINARY', 'auto-detect')
替换为:
IMAGEMAGICK_BINARY = r"C:\Program Files\ImageMagick-7.0.8-Q16\magick.exe"
具体的替换值需要确认ImageMagick安装目录进行更改。

