前言
開(kāi)始講之前先解決大家看到這個(gè)標(biāo)題時(shí)心里的3個(gè)疑惑:
1.視頻剪輯不是用Adobe的軟件就可以做了嗎?
2.為什么要用Serverless?
3.如何寫(xiě)代碼做視頻剪輯?
哪些視頻剪輯場(chǎng)景是Adobe等軟件無(wú)法完成的
大家平常接觸到的視頻剪輯通常都是使用Premiere,AE等這類專業(yè)工具來(lái)完成視頻剪輯。他們能完成一些復(fù)雜的效果,比如做宣傳視頻,廣告視頻等。
但有些企業(yè)在某些業(yè)務(wù)場(chǎng)景下是期望能批量且自動(dòng)化的完成視頻剪輯。
比如以下幾種場(chǎng)景:
1.假設(shè)學(xué)校期望能在學(xué)生上完網(wǎng)課之后馬上呈現(xiàn)所有學(xué)生學(xué)習(xí)過(guò)程中的精彩視頻,配上學(xué)校的logo和宣傳語(yǔ)等,讓學(xué)生一鍵分享自己的成果。假設(shè)有1萬(wàn)個(gè)學(xué)生,需要為每個(gè)學(xué)生制作獨(dú)一無(wú)二的視頻,所以需要批量且自動(dòng)化的完成1萬(wàn)個(gè)不同的視頻剪輯。
2.某次營(yíng)銷活動(dòng)中,需要為不同的用戶生成不同的頭像視頻來(lái)吸引用戶參與。每個(gè)用戶的頭像都是獨(dú)一無(wú)二的,生成的視頻也是獨(dú)一無(wú)二的,用戶可能成千上萬(wàn),因此自動(dòng)化完成是必須的條件。
3.網(wǎng)紅運(yùn)營(yíng)公司期望能給所有主播生成統(tǒng)一的營(yíng)業(yè)視頻。可能有100個(gè)主播,專門(mén)找一個(gè)人剪輯100個(gè)視頻好像勉強(qiáng)能接受,但如果每周都要剪一次不同的視頻呢?所以自動(dòng)化,批量和可定制化的剪輯就成了主要需求。
以上的場(chǎng)景中有三個(gè)特點(diǎn):
1.批量
2.自動(dòng)化
3.可定制
對(duì)于符合以上特點(diǎn)的場(chǎng)景,是傳統(tǒng)的視頻剪輯工具或者模版化的視頻處理軟件無(wú)法輕松完成的。
為什么推薦用Serverless
因?yàn)橐曨l剪輯這樣的業(yè)務(wù)有幾個(gè)特點(diǎn):
·使用時(shí)段集中。
·計(jì)算量大。
單獨(dú)購(gòu)買(mǎi)高規(guī)格的服務(wù)器利用率很低,買(mǎi)便宜的服務(wù)器計(jì)算能力又跟不上。
因此Serverless按量計(jì)費(fèi)的特點(diǎn),以及高性能的計(jì)算能力,完美匹配了這樣的需求場(chǎng)景。
既能達(dá)到100%的利用率,又能按量使用它的高性能計(jì)算能力。
同時(shí),騰訊云Serverless云函數(shù)擁有多變的可編程環(huán)境,可以使用任意熟悉的編程語(yǔ)言,靈活性很高。
如何通過(guò)寫(xiě)代碼做視頻剪輯
本文章提到的所有視頻剪輯的功能,都是用FFmpeg這個(gè)工具,先給大家講講什么是FFmpeg。
FFmpeg(http://ffmpeg.org/)是一個(gè)用來(lái)做視頻處理的開(kāi)源工具,它有非常強(qiáng)大的功能,它支持視頻剪輯、視頻轉(zhuǎn)碼、視頻編輯、音頻處理、添加文字、視頻拼接、拉流推流直播等功能。
我們通過(guò)不同的FFmpeg命令就可以編程完成不同的視頻剪輯功能,組合編排起來(lái),就可以應(yīng)對(duì)各種批量自動(dòng)化的場(chǎng)景了。
視頻剪輯批量化、自動(dòng)化與定制化實(shí)踐
常見(jiàn)的視頻剪輯場(chǎng)景主要包含以下幾種:
1.視頻轉(zhuǎn)碼
2.視頻裁剪
3.視頻加文字
4.視頻加圖片
5.視頻拼接
6.視頻加音頻
7.視頻轉(zhuǎn)場(chǎng)
8.視頻特效
9.視頻加速慢速播放
接下來(lái)給大家展示一些具體的FFmpeg命令例子,如果你在本地安裝了FFmpeg,也可以在本地執(zhí)行這些命令。關(guān)于怎么安裝FFmpeg,可以去看官網(wǎng)的教程(http://ffmpeg.org/)。
// 將MOV視頻轉(zhuǎn)成mp4視頻
ffmpeg -i input.mov output.mp4
// 將原視頻的幀率修改為24
ffmpeg -i input.mp4 -r 24 -an output.mp4
// 將mp4視頻轉(zhuǎn)為可用于直播的視頻流
ffmpeg -i input.mp4 -codec: copy -bsf:v h264_mp4toannexb -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8
// 將視頻分別變?yōu)?80x360,并把碼率改400
ffmpeg -i input.mp4 -vf scale=480:360,pad=480:360:240:240:black -c:v libx264 -x264-params nal-hrd=cbr:force-cfr=1 -b:v 400000 -bufsize 400000 -minrate 400000 -maxrate 400000 output.mp4
// 給視頻添加文字,比如字幕、標(biāo)題等。
// `fontfile`是要使用的字體的路徑,`text`是你要添加的文字,
// `fontcolor`是文字的顏色,`fontsize`是文字大小,`box`是給文字添加底框。
// `box=1`表示enable,`0`表示disable,`boxcolor`是底框的顏色,black@0.5表示黑色透明度是50%,`boxborderw`是底框距文字的寬度
// `x`和`y`是文字的位置,`x`和`y`不只支持?jǐn)?shù)字,還支持各種表達(dá)式,具體可以去官網(wǎng)查看
ffmpeg -i input.mp4 -vf "drawtext=fontfile=/path/to/font.ttf:text='你的文字':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2" -codec:a copy output.mp4
// 給視頻添加圖片,比如添加logo、頭像、表情等。filter_complex表示復(fù)合的濾鏡,overlay表示表示圖片的x和y,enable表示圖片出現(xiàn)的時(shí)間段,從0-20秒
ffmpeg -i input.mp4 -i avatar.JPG -filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" -pix_fmt yuv420p -c:a copy output.mp4
// 視頻拼接,list.txt里面按順序放所有要拼接的視頻的文件路徑,如下。
// 注意,如果視頻的分辨率不一致會(huì)導(dǎo)致拼接失敗。
ffmpeg -f concat -safe 0 -i list.txt -c copy -movflags +faststart output.mp4
// list.txt的格式如下
file 'xx.mp4'
file 'yy.mp4'
// 視頻加音頻,stream_loop表示是否循環(huán)音頻內(nèi)容,-1表示無(wú)限循環(huán),0表示不循環(huán)。shortest表示最短的MP3輸入流結(jié)束時(shí)完成編碼。
ffmpeg -y -i input.mp4 -stream_loop -1 -i audio.mp3 -map 0:v -map 1:a -c:v copy -shortest output.mp4
FFmpeg能做的事情非常多,這里就不一一講解了。更多的玩法可以在FFmpeg官網(wǎng)上探索。
對(duì)于音頻的編輯也是同樣的道理,F(xiàn)Fmpeg也支持單獨(dú)對(duì)音頻進(jìn)行編輯。
運(yùn)行FFmpeg命令
因?yàn)镻ython運(yùn)行這些命令比較便捷,所以我們可以使用python來(lái)運(yùn)行所有的FFmpeg命令。
同時(shí),python在騰訊云Serverless云函數(shù)上運(yùn)行性能也比較好,部署也方便。
通過(guò)Python來(lái)使用FFmpeg的視頻剪輯代碼在文章最后有開(kāi)源鏈接,并且,在官網(wǎng)上也有模版可以直接使用,幾乎覆蓋了常見(jiàn)的音視頻剪輯等操作。
這里就展示一個(gè)簡(jiǎn)單的調(diào)用代碼示例。
child = subprocess.run('./ffmpeg -i input.mov output.mp4',
stdout=subprocess.PIPE,
stderr=subprocess.PIPE, close_fds=True, shell=True)
if child.returncode == 0:
print("success:", child)
else:
print("error:", child)
raise KeyError("處理視頻失敗, 錯(cuò)誤: ", child)
在Serverless部署
上面提到的常見(jiàn)的視頻剪輯場(chǎng)景我已經(jīng)實(shí)現(xiàn)并開(kāi)源了,下載代碼直接部署到Serverless就可以使用了,下載地址:
https://github.com/woodyyan/ffmpeg-composition
https://github.com/woodyyan/ffmpeg-splice
這里分為了兩個(gè)函數(shù),一個(gè)負(fù)責(zé)處理單個(gè)視頻,一個(gè)負(fù)責(zé)把多個(gè)視頻拼接成一個(gè)視頻并配上背景音樂(lè)。
目前支持以下功能:
1.在視頻中添加文字
2.視頻分辨率轉(zhuǎn)換
3.在視頻中添加圖片
4.視頻拼接
5.添加背景音樂(lè)
源碼里展示的只是常見(jiàn)的一些視頻剪輯場(chǎng)景,大家可以根據(jù)自己的業(yè)務(wù)需要,編寫(xiě)自己的視頻剪輯邏輯。
方式一:Github Action自動(dòng)部署
1.Fork倉(cāng)庫(kù)。
2.在倉(cāng)庫(kù)的Settings-Secrets-Actions中添加TENCENT_SECRET_ID和TENCENT_SECRET_KEY兩個(gè)密鑰。ID和KEY可以在騰訊云的訪問(wèn)控制里面獲取。
3.添加之后,在Action中就可以發(fā)起部署了。每次修改代碼推送后,也會(huì)自動(dòng)觸發(fā)Action部署。
4.如果需要有一些自定義的配置,請(qǐng)修改serverless.yml。
5.云函數(shù)最終會(huì)自動(dòng)部署到TENCENT_SECRET_ID所在的賬號(hào)下。
方式二:云函數(shù)控制臺(tái)手動(dòng)部署
1.下載代碼。
2.在根目錄把所有文件和文件夾一起打包成一個(gè)ZIP文件。
3.去云函數(shù)控制臺(tái)(https://console.cloud.tencent.com/scf/list),新建一個(gè)函數(shù)。
4.選擇從頭開(kāi)始:
a.選擇python語(yǔ)言。
b.上傳ZIP文件。
c.函數(shù)內(nèi)存建議選擇較大的內(nèi)存。
d.開(kāi)啟異步執(zhí)行。
e.執(zhí)行超時(shí)時(shí)間根據(jù)視頻大小建議設(shè)置長(zhǎng)一點(diǎn),比如30秒以上。
f.配置觸發(fā)器,選擇API網(wǎng)關(guān)觸發(fā)器,關(guān)閉集成響應(yīng)。
5.完成部署后,就可以通過(guò)API網(wǎng)關(guān)的URL開(kāi)始調(diào)用了。
真實(shí)案例回顧
一個(gè)做網(wǎng)課的學(xué)校,需要每次在學(xué)生上完網(wǎng)課之后把上網(wǎng)課的錄像制作成一段30秒的視頻,作為學(xué)生的學(xué)習(xí)成果。
此案例有幾個(gè)關(guān)鍵的信息點(diǎn):
1.通常一堂課有200個(gè)學(xué)生,需要同時(shí)制作200個(gè)視頻。
2.需要把1小時(shí)的上課視頻剪輯成30秒。
3.由于每個(gè)學(xué)生的上課屏幕有所不同,因此錄制的視頻都是不同的。
4.最終的成果視頻還需要加上學(xué)生的名字和頭像。
5.學(xué)生結(jié)束上課的時(shí)間很集中,因此制作視頻時(shí)會(huì)有短時(shí)高并發(fā)。
6.每次上完課的時(shí)候才會(huì)需要制作視頻,時(shí)段比較固定且集中。
綜合上述特點(diǎn),用騰訊云Serverless云函數(shù)來(lái)做這樣的視頻剪輯帶來(lái)了多個(gè)好處:
1.解決了200個(gè)并發(fā)的問(wèn)題,不需要自己搭建過(guò)多的服務(wù)器。
2.解決了只在發(fā)生時(shí)段使用的問(wèn)題,其他時(shí)段都沒(méi)有成本產(chǎn)生。
3.解決了需要較強(qiáng)計(jì)算能力快速制作視頻的問(wèn)題。
下面是這個(gè)案例的參考架構(gòu)圖:
總結(jié)
通過(guò)編排、組合、復(fù)用上面列舉的各種音視頻剪輯的場(chǎng)景,就能制作出各種各樣想要的效果。
然后把視頻剪輯中用來(lái)控制各種效果的參數(shù),變成調(diào)用服務(wù)時(shí)傳入的參數(shù),就能實(shí)現(xiàn)各種效果的定制化了。
最后再總結(jié)一下通過(guò)這種寫(xiě)代碼的方式完成視頻剪輯的使用場(chǎng)景:
1.解決通過(guò)修改個(gè)別參數(shù)來(lái)批量制作視頻的場(chǎng)景。
2.解決通過(guò)用戶觸發(fā)來(lái)自動(dòng)化制作視頻的場(chǎng)景。
3.解決不同場(chǎng)景需要不同定制化的制作視頻的場(chǎng)景。
同時(shí),利用騰訊云Serverless云函數(shù)來(lái)完成視頻剪輯,同樣也解決了以下幾個(gè)問(wèn)題:
1.因?yàn)橥ǔR曨l剪輯不是全天運(yùn)行,利用騰訊云Serverless云函數(shù)按量付費(fèi)的特性能優(yōu)化成本。
2.因?yàn)橐曨l剪輯通常是重計(jì)算場(chǎng)景,利用騰訊云Serverless云函數(shù)可選的高規(guī)格配置來(lái)應(yīng)對(duì)這種重計(jì)算場(chǎng)景。
3.在批量制作視頻的場(chǎng)景中通常會(huì)存在高并發(fā),利用騰訊云Serverless云函數(shù)自動(dòng)彈性伸縮的特性能輕松應(yīng)對(duì)高并發(fā)。