Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

21.3. MoviePy

21.3.1. 安装 MoviePy

		
pip install moviepy		
		
		

21.3.2. 图片处理

		
# 加载产品图片
product_image = ImageClip("product_image.png", duration=10)		
		
		

21.3.3. 图片转视频

		
import os
import moviepy.video.io.ImageSequenceClip

def merge_image_to_video_moviepy(folder_name):
    fps = 25
    image_files = []
    for f1 in os.listdir(folder_name):
        filename = os.path.join(folder_name, f1)
        for index in range(fps):
            image_files.append(filename)
    clip1 = moviepy.video.io.ImageSequenceClip.ImageSequenceClip(image_files, fps=fps)
    clip1.write_videofile("output.mp4", fps=fps)
    return clip1


if __name__ == '__main__':
    # 图片文件尺寸必须一致
    folder_name = r"test/images"
    clip1 = merge_image_to_video_moviepy(folder_name)		
		
		

21.3.4. 图片生成视频

			
from moviepy.editor import *


image = ImageClip("image.png")
image = image.set_duration(5)
image = image.set_position(('center', 'top'))
# image = image.resize(height=200)
image.write_videofile("movie.mp4",fps=30)
			
			
		

21.3.5. 图片裁剪

			
resized = resize(coverImageClip, 1.2).set_duration(3)
clip = crop(resized, x_center=-480, y_center=-320, width=960, height=640)	
			
		

21.3.5.1. 图片裁剪

			
clip = coverImageClip.resize((1024,768))
clip = crop(clip, x_center=-480, y_center=-320, width=960, height=640)		
			
			

21.3.6. 音频处理

21.3.6.1. 合并音频文件

			
audioFileClip1 = AudioFileClip("1.mp3")
audioFileClip2 = AudioFileClip("2.mp3")
audioFileClip3 = AudioFileClip("2.mp3")
clips = [audioFileClip1,audioFileClip2,audioFileClip3]

concat = concatenate_audioclips(clips)
concat.write_audiofile("netkiller.mp3")			
			
			

21.3.6.2. 提取视频中的音频

			
#coding=utf-8
import moviepy.editor as mov

video = mov.VideoFileClip('test.mp4')
audio = video.audio
audio.write_audiofile('test.wav')		
			
			
			
neo@MacBook-Pro-Neo ~/workspace/python/video % python3 audio.py 
MoviePy - Writing audio in test.wav
MoviePy - Done.           
                                                                                                                                   
neo@MacBook-Pro-Neo ~/workspace/python/video % ls *.wav
test.wav
			
			

21.3.7. 视频处理

21.3.7.1. 合成视频

			
clip1 = VideoFileClip("test1.mp4")
clip2 = VideoFileClip("test2.mp4")
clip3 = VideoFileClip("test3.mp4")

video = CompositeVideoClip([clip1,clip2,clip3],size=(1920, 1080))
video.write_videofile("video.mp4")				
			
			
			
from moviepy.editor import VideoFileClip, concatenate_videoclips
# 重新设置视频大小
clip1 = VideoFileClip("chip1.mp4").resize((1920, 1080)) 
# 剪切指定时间片段(单位秒)
clip2 = VideoFileClip("chip2.mp4").subclip(50,60) 
# 剪切持续时间(单位秒)
clip3 = VideoFileClip("chip3.mp4").set_duration(5) 
# 按顺序拼接视频
final_clip = concatenate_videoclips([clip1,clip2,clip3])
final_clip.write_videofile("video.mp4")			
			
			

21.3.7.2. 从视频中提取音频

			
from moviepy.editor import *
video_path = 'my_video.avi'   #视频地址
audio_path = 'my_audio.mp3'   #提取音频保存位置
video = VideoFileClip(video_path)
video.audio.write_audiofile(audio_path)
			
			
			

21.3.7.3. 去除视频中的音频

			
old_video = '有声音.avi'
new_video = '无声音.avi'
 
video = VideoFileClip(old_video)
video = video.without_audio()  #删除声音,返回新的视频对象,原有对象不更改
video.write_videofile(new_video)
			
			
			

21.3.7.4. 对视频添加音频

			
old_video = '无声音.avi'
audio = 'audio.mp3'
new_video = '有声音.avi'
 
video = VideoFileClip(video_path)
audio_clip = AudioFileClip(audio)
video = video.set_audio(audio_clip)
video.write_videofile(new_video)
			
			
			

21.3.7.5. 音频合成剪辑实现对白

			
# 对白
dialogue1 = AudioFileClip("voice/tom.mp3")
dialogue2 = AudioFileClip("voice/jerry.mp3")

# 制作混合音轨
concat = concatenate_audioclips([dialogue1, dialogue2])
compo = CompositeAudioClip([dialogue1.volumex(1.2), # 音量设置大小
                            dialogue2.set_start(5)])# 音频起始时间				
			
			

21.3.8. 效果处理

21.3.8.1. 淡入淡出

			
from moviepy.video.fx import fadein, fadeout			

imageClip = ImageClip(image).set_duration(duration).set_audio(audioFileClip)

# 添加淡入和淡出效果
imageClip = fadein.fadein(imageClip, 1)  # 从开始处淡入2秒
imageClip = fadeout.fadeout(imageClip, 1)  # 从结束处淡出2秒			
			
			

21.3.9. 字幕

		
from moviepy.video.io.VideoFileClip import VideoFileClip
from moviepy.video.fx import fadein, fadeout
from moviepy.video.tools import subtitles
 
# 加载视频剪辑
clip = VideoFileClip("input.mp4")
 
# 添加淡入和淡出效果
clip = fadein.fadein(clip, 2)  # 从开始处淡入2秒
clip = fadeout.fadeout(clip, 2)  # 从结束处淡出2秒
 
# 添加字幕
subtitles_txt = [
    ("Hello, World!", 1),  # 在1秒时显示 "Hello, World!"
    ("Welcome to MoviePy", 3),  # 在3秒时显示 "Welcome to MoviePy"
]
clip = subtitles.subtitles(clip, subtitles_txt)
 
# 保存视频
clip.write_videofile("output.mp4")		
		
		

21.3.9.1. 苹果电脑的字体

			
brew install ImageMagick			
			
			
			
			
			
			

查看可用字体

			
from moviepy.editor import TextClip
print ( TextClip.list("font") )		
			
			

运行结果

			
neo@MacBook-Pro-Neo ~/workspace/python/video % /usr/bin/python3 /Users/neo/workspace/python/video/font.py
['AvantGarde-Book', 'AvantGarde-BookOblique', 'AvantGarde-Demi', 'AvantGarde-DemiOblique', 'Bookman-Demi', 'Bookman-DemiItalic', 'Bookman-Light', 'Bookman-LightItalic', 'Courier', 'Courier-Bold', 'Courier-BoldOblique', 'Courier-Oblique', 'fixed', 'Helvetica', 'Helvetica-Bold', 'Helvetica-BoldOblique', 'Helvetica-Narrow', 'Helvetica-Narrow-Bold', 'Helvetica-Narrow-BoldOblique', 'Helvetica-Narrow-Oblique', 'Helvetica-Oblique', 'NewCenturySchlbk-Bold', 'NewCenturySchlbk-BoldItalic', 'NewCenturySchlbk-Italic', 'NewCenturySchlbk-Roman', 'Palatino-Bold', 'Palatino-BoldItalic', 'Palatino-Italic', 'Palatino-Roman', 'Symbol', 'Times-Bold', 'Times-BoldItalic', 'Times-Italic', 'Times-Roman']			
			
			

指定字体路径

			
from moviepy.editor import TextClip
font_path = './font/heimi.ttf'
txtClip = TextClip('《Netkiller Python 手札》',color='white', font=font_path,kerning = 5, fontsize=100)			
			
			

苹果电脑的字体安装在 /System/Library/Fonts/ 目录中。

			
from moviepy.editor import *

video = VideoFileClip("test.mp4").subclip(50,60)

# Make the text. Many more options are available.
txt_clip = ( TextClip("《Netkiller Python 手札》",font="/System/Library/Fonts/PingFang.ttc", fontsize=70,color='white')
             .set_position('center')
             .set_duration(10) )

result = CompositeVideoClip([video, txt_clip]) # Overlay text on video
result.write_videofile("test.webm",fps=25) # Many options...
			
			
			

21.3.9.2. 字体

查看系统自带字体

			
from moviepy.editor import TextClip
print (TextClip.list("font") )		
			
			

21.3.9.3. 制作字幕

			
import pysrt

# 创建一个新的字幕对象
subs = pysrt.SubRipFile(0)

# 添加自定义字幕
subs.append(pysrt.SubRipItem(1, 100, 200, '自定义字幕内容'))

# 保存字幕
subs.save('custom_subtitle.srt')			
			
			

21.3.10. 音量大小调节

			
VolumeMultiple = 0.8
clip = clip.volumex(VolumeMultiple)			
			
		

21.3.11. 视频中设置背景音乐

			
bgm = AudioFileClip("music/paino.mp3")			
videoclip = videoclip.set_audio(bgm)			
			
		

21.3.12. 画面截图

			
# 保存视频第一帧的画面
clip.save_frame("Screenshot.jpeg") 

# 保存视频第10秒的画面
clip.save_frame("Screenshot.png", t=10) 
			
		

21.3.13. FAQ 常见问题

21.3.13.1. 视频输出没有声音的

解决方案,增加 audio_codec 参数

			
finalclip = concatenate_videoclips(clips)
finalclip.write_videofile("output.mp4",fps=5,audio_codec="aac")