iT邦幫忙

2

【電腦程式與生活】(5) 用python做簡單的影片剪輯吧

之前有在網上查到moviepy是python中強大的編輯影片模組,
最近剛好有空把之前簡略的文章重新整理過,
以下記錄下安裝的過程及簡易的使用方法。

作業系統: win10
開發環境: anaconda->Spyder3.3.2, python版本3.7

Note: 在安裝moviepy時小馬碰到許許多多的坑,
如果你也安裝失敗的話,可參考文中所提的解決方法,
祝大家都能安裝成功

一、安裝教學

方法一、直接用pip指令安裝

要安裝moviepy,最簡單的方法應該是直接在於anaconda prompt命令視窗中下指令:

pip install moviepy

然而小馬直接使用pip install moviepy會安裝失敗
查看錯誤訊息是Cannot uninstall 'imageio'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

在網上查詢資料說可以用以下指令解決:

pip install moviepy --ignore-installed

我猜意思可能是說如果安裝過程中,
碰到一些裝不起來的小套件就先忽略它
由於小馬發現當前moviepy最新的版本為1.0.1,
但有些功能好像要版本1.0.0才可正常使用,
建議可直接用下面指令來安裝:

pip install moviepy==1.0.0 --ignore-installed

方法二、手動安裝

pip install moviepy會安裝失敗,
可採用較為麻煩的手動安裝方法,
首先到GitHub下載moviepy的程式碼:

https://ithelp.ithome.com.tw/upload/images/20200310/20117114OJbAcXx3Vj.png
選右方的「Clone or download」按鈕按下去,
按「Download ZIP」,
把下載下來的檔案解壓縮(比如說把檔案放在桌面),
譬如小馬的檔案路徑是C:\Users\User\Desktop\moviepy-master

接著請在anaconda prompt命令視窗中輸入指令

cd C:\Users\User\Desktop\moviepy-master

意思是切換工作路徑至C:\Users\User\Desktop\moviepy-master這個資料夾
https://ithelp.ithome.com.tw/upload/images/20200310/20117114SJUJm2UQld.png

接著輸入指令

python setup.py install

應該就會開始安裝了

安裝ffmpeg

安裝完moviepy後,似乎還無法直接執行程式,會報錯:
https://ithelp.ithome.com.tw/upload/images/20200310/20117114OU1GaoTi8Z.png
此時仍需在anaconda prompt命令視窗下一行指令安裝必要的軟件ffmpeg:

conda install ffmpeg -c conda-forge

這次小馬換了另一台電腦測試似乎沒什麼問題。

小馬曾在win7的電腦上測試,
安裝完ffmpeg後,
竟發現串接的影片會沒有聲音,
並且網上搜索不到解決方法,
後來嘗試在anaconda prompt下指令

conda uninstall ffmpeg

竟奇蹟似的修好了(?)原因不明

二、程式碼教學

基礎程式

如果想將三個影片檔案1.mp4, 2.mp4, 3.mp4串接為一個,
並輸出影片名out.mp4(新的影片單純按順序播放這三個影片),
程式碼如下:

from moviepy.editor import VideoFileClip, concatenate_videoclips

clip1 = VideoFileClip("1.mp4")
clip2 = VideoFileClip("2.mp4")
clip3 = VideoFileClip("3.mp4")

finalclip = concatenate_videoclips([clip1, clip2, clip3])
finalclip.write_videofile("out.mp4") # 寫出檔案out.mp4

目前測試發現要用concatenate_videoclips串接影片的話,
原本的影片畫面的長寬大小需要相同,否則串起來的影片會變形

moviepy尚有許多功能,為了方便使用,
小馬把它包裝為一個個的函數。
首先,程式開頭需要引入需要的函式庫:

import os
from moviepy.editor import VideoFileClip, concatenate_videoclips
from moviepy.audio.io.AudioFileClip import AudioFileClip

串接影片

def videoConcat(name, videos, path="./"):
    # 函數功能: 將videos內的視頻首尾相接,輸出name
    # ex: videoConcat("out.mp4", ["1.mp4", "2.mp4", "3.mp4"],"./music")
    # NOTE: 每個影片的畫面長寬需一致
    origin_path = os.getcwd()
    os.chdir(path)
    finalclip = concatenate_videoclips([VideoFileClip(v) for v in videos])
    finalclip.write_videofile(name)
    os.chdir(origin_path)

大量分組串接影片(譬如說全部有154個影片,每11個一組,共串成14個影片)

def batchVideoConcat(videoPerFilm, videoNum, path="./"):
    # 函數功能: 批量將指定路徑下的影片串接,每「videoPerFilm」個影片串成1個,共「videoNum」個
    # ex: batchVideoConcat(3,2,'./music') 
    # NOTE: 每個影片的畫面長寬需一致
    origin_path = os.getcwd()
    os.chdir(path)
    f=os.listdir()
    f.sort() # 按文件名排序,否則為亂序
    for i in range(videoNum):
        videos = [f[i*videoPerFilm+j] for j in range(videoPerFilm)]
        videoConcat("myVideo_"+str(i)+".mp4", videos)
    os.chdir(origin_path)

截取影片的一部分

def mySubclip(in_video, out_video, t1, t2, path="./"):
    # 函數功能: 在指定路徑下,從in_video截取t1~t2秒的視頻,輸出out_video
    # ex: mySubclip("1.mp4", "out.mp4", 10, 15,'./music'),參數可接受浮點數
    origin_path = os.getcwd()
    os.chdir(path)
    with VideoFileClip(in_video) as video:
        video_clip = video.subclip(t1, t2)
        video_clip.write_videofile(out_video)
    os.chdir(origin_path)

截取影片(mp4檔)的聲音(mp3檔)

def myAudioclip(in_video, out_audio, path="./"):
    # 函數功能: 在指定路徑下,截取in_video的聲音檔,輸出out_audio
    # ex: mySubclip("1.mp4", "out.mp3", './music')
    origin_path = os.getcwd()
    os.chdir(path)
    audio_clip = AudioFileClip(in_video)
    audio_clip.write_audiofile(out_audio)
    os.chdir(origin_path)

批量調整影片的聲音

def batch_volumex(x, path="./"):
    # 函數功能: 在指定路徑下,將該資料夾的視頻聲音調為x倍
    # ex: batch_volumex(5, './music')
    origin_path = os.getcwd()
    os.chdir(path)
    for fname in os.listdir():
        clip = VideoFileClip(fname)
        newclip = clip.volumex(x)
        newclip.write_videofile("new_"+fname)
    os.chdir(origin_path)

註:這段程式碼在moviepy的最新版本1.0.1下會出現錯誤AttributeError: 'NoneType' object has no attribute 'stdout'
需要改安裝moviepy版本1.0.0才可使用,
可在anaconda prompt中下指令pip list查看自己所有已安裝的模組版本。

參考資料

  1. MoviePy - 中文文檔1- 下載與安裝

尚未有邦友留言

立即登入留言