Mac High Sierra + pyCharm + py3.5 + Moviepy 工廠式視訊合成測試
近日接觸手機端小視訊合成業務,發現現有的主流視訊合成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
今天先到這兒,有問題請下方留言,謝謝~