近日接触手机端小视频合成业务,发现现有的主流视频合成APP中,能实现“单张图片 + 指定语音”类型的APP屈指可数,ios自带APP“Clips”仅能合成正方形图片,超出正方形部分会自动进行黑色背景补齐。
于是需要一个能在手机端完成的、实现“单张图片 + 指定语音”、视频画面尺寸可自行定制的APP或小程序。
百度之,忽略中间的数据传输部分,发现py有可工厂化的服务器端视频合成模块Moviepy,利用已有 Mac High Sierra + pyCharm + py3.5 进行测试。
一、安装Moviepy
(1) 在pyCharm上搜索模块“moviepy”并安装
注:安装期间报错,更新pip后顺利安装,因依赖模块较多,安装时间较长
(2) 安装 ImageMagick, http://www.imagemagick.org/script/download.php
跳转至Mac部分,下载提示如下:
如图,官方推荐使用 MacPorts 进行 ImageMagick 安装,MacPorts 的pkg下载链接 https://www.macports.org/install.php,按提示进行 pkg 安装后即完成 ImageMagick 安装
(3) 在pyCharm上搜索模块“ffmpeg”并安装(完成视频合成的关键部分)
二、利用 Moviepy 制作视频合成工厂的核心代码部分
视频合成工厂在量少时可以简单设计为队列模式,量多时可设计成并行池模式。这里讨论核心代码部分。代码如下。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time :2018/7/26 21:11
# @Author : Ale
# @File : compose.py
# @Software : PyCharm
from moviepy.editor import *
from moviepy.audio.fx import all
# 设置视频字体以支持中文字符
FONT_URL = '/Users/Ale/Library/Fonts/msyh.ttf'
def render(input_video, output_video="new_video.mp4"):
# 剪个10s的720x1280px的10s视频,即手机竖屏
background_clip = VideoFileClip(input_video, target_resolution=(1280, 720)).subclip(0, 10)
# 屏幕下方居中加文字, 持续10s
text_clip1 = TextClip('我是字幕', fontsize=30, color='white', font=FONT_URL)
text_clip1 = text_clip1.set_position(('center', 'bottom'))
text_clip1 = text_clip1.set_duration(10)
# 右下角加文字, 持续3s
text_clip2 = TextClip('我是右下角字幕', fontsize=30, color='white', font=FONT_URL)
text_clip2 = text_clip2.subclip(0, 3).set_position(('right', 'bottom'))
# 图片放中间, 从第2s开始播持续6s
image_clip = ImageClip('xx.png')
image_clip = image_clip.set_duration(6).set_position('center').set_start(2)
# 合成视频
video = CompositeVideoClip([background_clip, text_clip1, text_clip2, image_clip])
# 替换音频
audio_clip = AudioFileClip('a.mp3').subclip(0, 10)
video = video.set_audio(audio_clip)
# 调节音量
video = all.volumex(video, 0.8)
# 输出合成视频,libx264 = *.mp4 的默认编码格式
video.write_videofile(output_video, codec='libx264')
# 输出合成视频的音频部分
audio_output = video.audio
audio_output.write_audiofile('a-output.mp3')
print('Done')
if __name__ == '__main__':
print('Start')
# 事先用Pr等软件准备黑色背景的无声 backgroundvideo.mp4,视频时间长度需大于待输出视频时间长度
render(input_video="backgroundvideo.mp4", output_video="output_video.mp4")
说明:
1. 字幕部分为测试对中文字符的支持使用,若不手工指定支持中文字符的字体,则中文部分乱码。
2. moviepy的各函数参数用例可参考官网 http://zulko.github.io/moviepy/index.html,其中的视音频输入输出格式均可进行指定,支持web开发专用格式。(本博后续将推出该网站内容翻译,敬请期待!)
3. 输出视频 output_video.mp4 在 mac 系统自带播放器上无法输出声音,在 mac 版 Pr 内有声音且可分离出音频文件,单独输出视频合成后的音频部分,即
# 输出合成视频的音频部分
audio_output = video.audio
audio_output.write_audiofile('a-output.mp3')
发现视频声音确已进行替换。将合成视频拷贝至win系统后任一播放器均可成功播放视频声音。百度之谷歌之未搜索到相关问题及其解答,怀疑为 moviepy 、ffmpeg 及其依赖插件针对 macOS 版本的适配问题,后续会继续进行验证。
参考链接:
1. 用Python剪辑制作简单视频(moviepy) https://blog.csdn.net/u014563989/article/details/79953730
2. 用Python编辑视频:MoviePy https://baijiahao.baidu.com/s?id=1595821972028895763&wfr=spider&for=pc
3. 视频自媒体人:《几行python搞定一切》的安装方法 https://baijiahao.baidu.com/s?id=1590372519257149053&wfr=spider&for=pc
4. moviepy初体验 https://blog.csdn.net/zjshui/article/details/78343171
5. moviepy用户手册 http://zulko.github.io/moviepy/index.html
今天先到这儿,有问题请下方留言,谢谢~