使用Python+FFMPEG實現(xiàn)視頻分割與合并
前言
日常中偶爾會遇到需要簡單剪輯處理視頻的場景,以前我可能會拿出PR來剪輯一下,(別跟我說國產(chǎn)那些軟件,剪輯完視頻強制加上廣告片頭片尾惡心的一批),但是PR畢竟太重量級,剪個簡單的視頻都要花不少時間,直到我發(fā)現(xiàn)了FFmpeg……
這個FFmpeg真的是神器,免費開源功能強大,好像很多軟件都是基于這個開發(fā)的,它本身提供了命令行接口就已經(jīng)能滿足我們?nèi)粘5暮唵我曨l處理需求,我用來簡單處理視頻分割、合并,真的很香。
不過命令行用來處理一兩個還行,如果是要處理多個視頻,或者是服務(wù)端有視頻處理的需求(如轉(zhuǎn)碼、加水印這類),就需要有一種方便的方法在代碼里運用FFmpeg,于是本文打算介紹python和FFmpeg間的無縫接入調(diào)用~
ffmpy
首先FFmpeg是一個可執(zhí)行文件,要在Python中調(diào)用FFmpeg并且監(jiān)控它的狀態(tài),需要使用類似os.system()或者是subprocess模塊來創(chuàng)建子進(jìn)程,需要自己處理很多工作,比較麻煩……
ffmpy庫就是幫我們解決這個問題的,完美整合FFmpeg,把子進(jìn)程管理封裝好了,我們直接輸入好參數(shù)調(diào)用就完事了
代碼
本文只是簡單介紹python中調(diào)用ffmpeg的方法,F(xiàn)Fmpeg的功能很強大,限于篇幅本文不能一一介紹FFmpeg的功能,想深入了解FFmpeg的同學(xué)可以查看最后的參考資料~
視頻分割
例子是最簡單的從一個視頻中分割出一個片段的用法,并且使用了-vcodec copy -acodec copy參數(shù),表示音頻和視頻都不轉(zhuǎn)碼提高處理視頻的速度。
操作看下面的代碼就知道了,輸入輸出,安排得明明白白,輸入和輸出都是字典類型,文件名是key,參數(shù)是value。
import ffmpy
ff = ffmpy.FFmpeg(
inputs={'input.mp4': None},
outputs={'output.mp4': [
'-ss', '00:01:20',
'-t', '02:00:00',
'-vcodec', 'copy',
'-acodec', 'copy'
]}
)
ff.run()
在執(zhí)行ff.run()之前,可以先用print(ff.cmd)把命令打印出來看看。
上述的視頻分割操作,對應(yīng)的FFmpeg命令是:
ffmpeg -i input.mp4 -ss 00:01:20 -t 02:00:00 -vcodec copy -acodec copy output.mp4
視頻合并
視頻合并就比較麻煩了,如果直接用FFmpeg命令輸入多個視頻文件,輸出一個的話,需要轉(zhuǎn)碼過程,這樣速度就很慢了,失去了合并的意義。
我找了資料,只有使用文件列表的方式來合并視頻是可以直接合并不轉(zhuǎn)碼的,不過這要求先創(chuàng)建一個文件用來保存視頻列表,在Python中,我們可以通過創(chuàng)建臨時文件來實現(xiàn)。
代碼如下:
import os
import tempfile
import ffmpy
# 創(chuàng)建臨時文件
temp_dir = tempfile.mktemp()
os.mkdir(temp_dir)
concat_file = os.path.join(temp_dir, 'concat_list.txt')
with open(concat_file, 'w', encoding='utf-8') as f:
f.write('\n'.join([
'file C:/1.mp4',
'file C:/2.mp4',
'file C:/3.mp4',
]))
ff = ffmpy.FFmpeg(
global_options=['-f', 'concat'],
inputs={concat_file: None},
outputs={'output.mp4': ['-c', 'copy']}
)
ff.run()
搞定!
參考資料
ffmpy官方文檔:https://ffmpy-zh.readthedocs.io/zh/latest/ffmpy.html 用 Python 代碼生成視頻的縮略圖:https://blog.csdn.net/fei347795790/article/details/102068777 FFMPEG 視頻分割和合并:https://www.jianshu.com/p/cf1e61eb6fc8 FFmpeg 視頻處理入門教程:https://www.ruanyifeng.com/blog/2020/01/ffmpeg.html

