python調(diào)用ffmpeg命令行工具便捷操作視頻示例實(shí)現(xiàn)過(guò)程
文 |李曉飛
來(lái)源:Python 技術(shù)「ID: pythonall」
最近有了一個(gè)新任務(wù),需要將賽事視頻,拆分成兩分鐘以內(nèi)的小段,用于發(fā)布到短視頻平臺(tái)上。
本以為是個(gè)一次性的工作,結(jié)果賽事視頻數(shù)據(jù)巨大,視頻文件長(zhǎng)短不一,完全沒(méi)法手工處理,于是 Python 又一次拯救了我。
還等什么,開始干吧!
最重要的事
無(wú)論做什么事情,都要去分析一下最重要的是什么,然后集中精力攻克,再繼續(xù)找最重要的事。
對(duì)我們這個(gè)任務(wù)來(lái)說(shuō),不算是個(gè)大項(xiàng)目,不過(guò)呢,還是要找最重要的事開始,步步為營(yíng),最終將整個(gè)問(wèn)題解決了。
整體來(lái)來(lái)看,我們需要從一個(gè)目錄中讀取視頻文件,然后,對(duì)每個(gè)視頻文件進(jìn)行裁剪,最后將處理好的文件保存好。
在這個(gè)過(guò)程中,最重要的是什么呢?我覺(jué)得,是視頻裁剪,如果不能方便的裁剪視頻,其他的一切工作都是白費(fèi)的,是吧。
裁剪視頻
現(xiàn)在短視頻很流行,有很多視頻編輯軟件,功能豐富,而我們需要的只是裁剪功能,而且需要用編程的方式調(diào)用,那么最合適的莫過(guò)于 ffmpeg[1] 了。
ffmpeg 是一個(gè)命令行工具,功能強(qiáng)大,可以編程調(diào)用。
從 ffmpeg 官網(wǎng)上下載對(duì)應(yīng)操作系統(tǒng)的版本,我下的是 Windows 版[2]。
下載后解壓到一個(gè)目錄,然后將目錄下的 bin,配置到環(huán)境變量里。然后打開一個(gè)命令行,輸入:
> ffmpeg -version ffmpeg version 2021-10-07-git-b6aeee2d8b-full_build- ...
測(cè)試一下,能顯示出版本信息,說(shuō)明配置好了。
現(xiàn)在讀一下文檔,發(fā)現(xiàn)拆分視頻文件的命令是:
ffmpeg -i [filename] -ss [starttime] -t [length] -c copy [newfilename]
]
i
為需要裁剪的文件
ss
為裁剪開始時(shí)間
t
為裁剪結(jié)束時(shí)間或者長(zhǎng)度
c
為裁剪好的文件存放
好了,用 Python 寫一個(gè)調(diào)用:
import subprocess as sp def cut_video(filename, outfile, start, length=90): cmd = "ffmpeg -i %s -ss %d -t %d -c copy %s" % (filename, start, length, outfile) p = sp.Popen(cmd, shell=True) p.wait() return
- 定義了一個(gè)函數(shù),通過(guò)參數(shù)傳入
ffmpeg
需要的信息 - 將裁剪命令寫成一個(gè)字符串模板,將參數(shù)替換到其中
- 用
subprocess
的Popen
執(zhí)行命令,其中參數(shù)shell=True
表示將命令作為一個(gè)整體執(zhí)行 p.wait()
很重要,因?yàn)椴眉粜枰粫?huì)兒,而且是另起進(jìn)程執(zhí)行的,所以需要等執(zhí)行完成再做后續(xù)工作,否則可能找不到裁剪好的文件
這樣視頻裁剪工作就完成了,然后再看看什么是最重要的。
計(jì)算分段
視頻裁剪時(shí),需要一些參數(shù),特別是開始時(shí)間,如何確定呢?如果這件事做不好,裁剪工作就很麻煩。
所以看看如何計(jì)算裁剪分段。
我需要將視頻裁剪成一分半的小段,那么將需要知道目標(biāo)視頻文件的時(shí)間長(zhǎng)度。
獲取視頻長(zhǎng)度
如何獲得長(zhǎng)度呢?ffmpeg 提供了另一個(gè)命令 —— ffprobe
。
找了一下,可以合成一個(gè)命令來(lái)獲?。?/p>
> ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i a.flv 920.667
命令比較復(fù)雜哈,可以先不用管其他參數(shù),只要將要分析的視頻文件傳入就好了。命令的結(jié)果是顯示一行視頻文件的長(zhǎng)度。
于是可以編寫一個(gè)函數(shù):
import subprocess as sp def get_video_duration(filename): cmd = "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i %s" % filename p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) p.wait() strout, strerr = p.communicate() # 去掉最后的回車 ret = strout.decode("utf-8").split("\n")[0] return ret
- 函數(shù)只有一個(gè)參數(shù),就是視頻文件路徑
- 合成命令語(yǔ)句,將視頻文件路徑替換進(jìn)去
- 用
subprocess
來(lái)執(zhí)行,注意這里需要設(shè)置一下命令執(zhí)行后的輸出 - 用
wait
等待命令執(zhí)行完成 - 通過(guò)
communicate
提取輸出結(jié)果 - 從結(jié)果中提取視頻文件的長(zhǎng)度,返回
分段
得到了視頻長(zhǎng)度,確定好每個(gè)分段的長(zhǎng)度,就可以計(jì)算出需要多少分段了。
代碼很簡(jiǎn)單:
import math duration = math.floor(float(get_video_duration(filename))) part = math.ceil(duration / length)
注意,計(jì)算分段時(shí),需要進(jìn)行向上取整,即用 ceil
,以包含最后的一點(diǎn)尾巴。
得到了需要的分段數(shù),用一個(gè)循環(huán)就可以計(jì)算出每一段的起始時(shí)間了。
獲取文件
因?yàn)樘幚淼奈募芏?,所以需要自?dòng)獲取需要處理的文件。
方法很簡(jiǎn)單,也很常用,一般可以用 os.walk 遞歸獲取文件,還可以自己寫,具體根據(jù)實(shí)際情況。
for fname in os.listdir(dir): fname = os.path.join(dir, os.path.join(dir, fname)) basenames = os.path.basename(fname).split('.') mainname = basenames[0].split("_")[0] ...
提供視頻文件所在的目錄,通過(guò) os.listdir
獲取目錄中的文件,然后,合成文件的絕對(duì)路徑,因?yàn)檎{(diào)用裁剪命令時(shí)需要絕對(duì)路徑比較方便。
獲取文件名,是為了在后續(xù)對(duì)裁剪好的文件進(jìn)行命名。
代碼集成
現(xiàn)在每個(gè)部分都寫好了,可以將代碼集成起來(lái)了:
def main(dir): outdir = os.path.join(dir, "output") if not os.path.exists(outdir): os.mkdir(outdir) for fname in os.listdir(dir): fname = os.path.join(dir, os.path.join(dir, fname)) if os.path.isfile(fname): split_video(fname, outdir)
main
方法是集成后的方法- 先創(chuàng)建一個(gè)裁剪好的存儲(chǔ)目錄,放在視頻文件目錄中的 output 目錄里
- 通過(guò)
listdir
獲取到文件后,對(duì)每個(gè)文件進(jìn)行處理,其中判斷了一下是否為文件 - 調(diào)用
split_video
方法開始對(duì)一個(gè)視頻文件進(jìn)行裁剪
總結(jié)
總體而言,這是個(gè)很簡(jiǎn)單的應(yīng)用,核心功能就是調(diào)用了一個(gè) ffmpeg 命令。
相對(duì)于技術(shù),更重要的是如何對(duì)一個(gè)項(xiàng)目進(jìn)行分析和分解,以及從什么地方開始。
這里的方式起始時(shí),不斷地找最重要地事情,以最重要的事情為線索不斷地推進(jìn),最終以自下而上地方式解決整個(gè)問(wèn)題。
期望這篇文章對(duì)你有所啟發(fā),比心。
參考資料
[1]
ffmpeg: http://ffmpeg.org/
[2]
ffmpeg Window 版下載: https://www.jb51.net/softs/145521.html
以上就是python調(diào)用ffmpeg命令行工具便捷操作視頻示例實(shí)現(xiàn)過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于python調(diào)用命令行工具操作視頻的資料請(qǐng)關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。