python基于moviepy實(shí)現(xiàn)音視頻剪輯
實(shí)踐步驟
1.尋找合適的Python庫(kù)(安裝是否麻煩、使用是否簡(jiǎn)便、執(zhí)行會(huì)不會(huì)太久)
- moviepy 音視頻庫(kù)。分析需要用的API:代碼示例
2.定義輸入輸出
- 輸入:一個(gè)音視頻文件的地址,需要剪出來(lái)的時(shí)間段
- 輸出:剪輯片段的文件
3.設(shè)計(jì)執(zhí)行流程并一步步實(shí)現(xiàn)(定義函數(shù),與使用具體API相關(guān))
- 讀入并創(chuàng)建clip對(duì)象。
- 剪輯subclip,輸入時(shí)間參數(shù)可以是時(shí)間格式的字符串。
- 導(dǎo)出write_videofile。
4.結(jié)論:時(shí)間太久,片段多長(zhǎng)就花了多久的時(shí)間;CPU全跑滿了。
stackoverflowConcat videos too slow using Python MoviePY 里面有個(gè)答案說(shuō),調(diào)用包里封裝的ffmpeg函數(shù)會(huì)快一些:
You have some functions that perform direct calls to ffmpeg: github.com/Zulko/movie… And are therefore extremely efficient, for simple tasks such as yours.
5.重新設(shè)計(jì)和實(shí)現(xiàn),直接使用moviepy.video.io.ffmpeg_tools里的函數(shù):ffmpeg_extract_subclip(源音視頻文件,起,止,輸出名)。
- 這個(gè)函數(shù)中輸入的起止時(shí)間參數(shù)只能是數(shù)字,不能是字符串,而庫(kù)基本使用的接口函數(shù)傳入的是字符串??丛创a發(fā)現(xiàn)是有個(gè)把時(shí)間字符串轉(zhuǎn)換成數(shù)字的裝飾器的,一步步找就可以找到那個(gè)轉(zhuǎn)換的函數(shù)了。
6.結(jié)論:時(shí)間快了很多,幾乎是幾秒內(nèi)就完成。
- 但并不明白為什么快了這么多
7.優(yōu)化:一次處理多個(gè)時(shí)間段
- 輸入由一個(gè)起止時(shí)間,變?yōu)橐唤M起止時(shí)間
- 循環(huán)處理每一組起止時(shí)間
- 輸出的文件名按順序拼接
8.優(yōu)化:每段時(shí)間配上名字
- 輸入除了每一組的起止時(shí)間,還有后綴名
- 文件名+后綴得到輸出的文件名
9.優(yōu)化:輸入輸出的合法性校驗(yàn)
- 校驗(yàn)輸入地址是合法文件
- 校驗(yàn)時(shí)間段(沒什么必要)
- 不可以小于0
- 不可以大于視頻時(shí)間
- 起小于止
完整代碼
需要pip install moviepy
簡(jiǎn)單的使用
from moviepy.editor import VideoFileClip, concatenate_videoclips clipOri = VideoFileClip("E:/2020-03-29 19-31-39.mkv") #截取兩個(gè)subclip再拼接 #time_length = int(clipOri.duration) 這句可以獲取片子的時(shí) #超過(guò)時(shí)長(zhǎng)會(huì)報(bào)錯(cuò),時(shí)長(zhǎng)默認(rèn)用秒,也可以寫得更細(xì),(00:03:50.54)->3分50秒 cut1 = clipOri.subclip(0, 7053) cut2 = clipOri.subclip(7059, 8941) finalClip = concatenate_videoclips([cut1,cut2]) finalClip.write_videofile("E:/acut.mp4")
import os import moviepy.video.io.ffmpeg_tools as fftool from moviepy.tools import cvsecs def add_suffix(file_name, suffix): # 文件名拼接后綴 index = file_name.rfind('.') # 最后一個(gè)點(diǎn)號(hào) res = file_name[:index] + '_' + suffix + file_name[index:] return res # 輸入 file_name = r"./XXX.mkv" output_arr = [ ('04:20','05:07', '自我介紹'), ('05:07','17:47', '項(xiàng)目經(jīng)歷'), ('17:37','24:40', 'HTTPS'), ('24:40','28:10', '實(shí)現(xiàn)讀寫鎖'), ] if not os.path.isfile(file_name): # 校驗(yàn) print("不合法的輸入", file_name) for startStr, endStr, suffix in output_arr: start = cvsecs(startStr) end = cvsecs(endStr) if start < 0 or start >= end: # 校驗(yàn) print("不合法的時(shí)間",startStr, endStr) continue full_output_name = add_suffix(file_name, suffix) print('處理文件:', file_name, '時(shí)間:', startStr, '-', endStr) fftool.ffmpeg_extract_subclip(file_name,start,end,full_output_name) # 剪輯并輸出 print('處理功成功,輸出:',full_output_name)
參考
以上就是python基于moviepy實(shí)現(xiàn)音視頻剪輯的詳細(xì)內(nèi)容,更多關(guān)于python moviepy實(shí)現(xiàn)音視頻剪輯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flask模板渲染與Get和Post請(qǐng)求詳細(xì)介紹
這篇文章主要介紹了Flask模板渲染與Get和Post請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09Python中SyntaxError: invalid syntax報(bào)錯(cuò)解決
在編寫Python代碼時(shí),常見的SyntaxError錯(cuò)誤通常由括號(hào)不匹配、關(guān)鍵字拼寫錯(cuò)誤或不正確的縮進(jìn)引起,本文詳細(xì)介紹了錯(cuò)誤原因及多種解決方案,包括檢查括號(hào)、關(guān)鍵字,以及使用IDE的語(yǔ)法檢查功能等,感興趣的可以了解一下2024-09-09keras打印loss對(duì)權(quán)重的導(dǎo)數(shù)方式
這篇文章主要介紹了keras打印loss對(duì)權(quán)重的導(dǎo)數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06python批量替換頁(yè)眉頁(yè)腳實(shí)例代碼
這篇文章主要介紹了python批量替換頁(yè)眉頁(yè)腳實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01python目標(biāo)檢測(cè)SSD算法預(yù)測(cè)部分源碼詳解
這篇文章主要為大家介紹了python目標(biāo)檢測(cè)SSD算法預(yù)測(cè)部分源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-0510個(gè)使用Python必須知道的內(nèi)置函數(shù)
這篇文章小編主要向大家介紹的是10個(gè)使用Python必須知道的內(nèi)置函數(shù)reduce()、split()、map()等,更多后置函數(shù)請(qǐng)看下文2021-09-09利用TensorFlow訓(xùn)練簡(jiǎn)單的二分類神經(jīng)網(wǎng)絡(luò)模型的方法
本篇文章主要介紹了利用TensorFlow訓(xùn)練簡(jiǎn)單的二分類神經(jīng)網(wǎng)絡(luò)模型的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03