前言
開始講之前先解決大家看到這個標(biāo)題時心里的3個疑惑:
1.視頻剪輯不是用Adobe的軟件就可以做了嗎?
2.為什么要用Serverless?
3.如何寫代碼做視頻剪輯?
哪些視頻剪輯場景是Adobe等軟件無法完成的
大家平常接觸到的視頻剪輯通常都是使用Premiere,AE等這類專業(yè)工具來完成視頻剪輯。他們能完成一些復(fù)雜的效果,比如做宣傳視頻,廣告視頻等。
但有些企業(yè)在某些業(yè)務(wù)場景下是期望能批量且自動化的完成視頻剪輯。
比如以下幾種場景:
1.假設(shè)學(xué)校期望能在學(xué)生上完網(wǎng)課之后馬上呈現(xiàn)所有學(xué)生學(xué)習(xí)過程中的精彩視頻,配上學(xué)校的logo和宣傳語等,讓學(xué)生一鍵分享自己的成果。假設(shè)有1萬個學(xué)生,需要為每個學(xué)生制作獨一無二的視頻,所以需要批量且自動化的完成1萬個不同的視頻剪輯。
2.某次營銷活動中,需要為不同的用戶生成不同的頭像視頻來吸引用戶參與。每個用戶的頭像都是獨一無二的,生成的視頻也是獨一無二的,用戶可能成千上萬,因此自動化完成是必須的條件。
3.網(wǎng)紅運營公司期望能給所有主播生成統(tǒng)一的營業(yè)視頻??赡苡?00個主播,專門找一個人剪輯100個視頻好像勉強能接受,但如果每周都要剪一次不同的視頻呢?所以自動化,批量和可定制化的剪輯就成了主要需求。
以上的場景中有三個特點:
1.批量
2.自動化
3.可定制
對于符合以上特點的場景,是傳統(tǒng)的視頻剪輯工具或者模版化的視頻處理軟件無法輕松完成的。
為什么推薦用Serverless
因為視頻剪輯這樣的業(yè)務(wù)有幾個特點:
·使用時段集中。
·計算量大。
單獨購買高規(guī)格的服務(wù)器利用率很低,買便宜的服務(wù)器計算能力又跟不上。
因此Serverless按量計費的特點,以及高性能的計算能力,完美匹配了這樣的需求場景。
既能達(dá)到100%的利用率,又能按量使用它的高性能計算能力。
同時,騰訊云Serverless云函數(shù)擁有多變的可編程環(huán)境,可以使用任意熟悉的編程語言,靈活性很高。
如何通過寫代碼做視頻剪輯
本文章提到的所有視頻剪輯的功能,都是用FFmpeg這個工具,先給大家講講什么是FFmpeg。
FFmpeg(http://ffmpeg.org/)是一個用來做視頻處理的開源工具,它有非常強大的功能,它支持視頻剪輯、視頻轉(zhuǎn)碼、視頻編輯、音頻處理、添加文字、視頻拼接、拉流推流直播等功能。
我們通過不同的FFmpeg命令就可以編程完成不同的視頻剪輯功能,組合編排起來,就可以應(yīng)對各種批量自動化的場景了。
視頻剪輯批量化、自動化與定制化實踐
常見的視頻剪輯場景主要包含以下幾種:
1.視頻轉(zhuǎn)碼
2.視頻裁剪
3.視頻加文字
4.視頻加圖片
5.視頻拼接
6.視頻加音頻
7.視頻轉(zhuǎn)場
8.視頻特效
9.視頻加速慢速播放
接下來給大家展示一些具體的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)的時間段,從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里面按順序放所有要拼接的視頻的文件路徑,如下。
// 注意,如果視頻的分辨率不一致會導(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表示無限循環(huán),0表示不循環(huán)。shortest表示最短的MP3輸入流結(jié)束時完成編碼。
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)上探索。
對于音頻的編輯也是同樣的道理,F(xiàn)Fmpeg也支持單獨對音頻進(jìn)行編輯。
運行FFmpeg命令
因為Python運行這些命令比較便捷,所以我們可以使用python來運行所有的FFmpeg命令。
同時,python在騰訊云Serverless云函數(shù)上運行性能也比較好,部署也方便。
通過Python來使用FFmpeg的視頻剪輯代碼在文章最后有開源鏈接,并且,在官網(wǎng)上也有模版可以直接使用,幾乎覆蓋了常見的音視頻剪輯等操作。
這里就展示一個簡單的調(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("處理視頻失敗, 錯誤: ", child)
在Serverless部署
上面提到的常見的視頻剪輯場景我已經(jīng)實現(xiàn)并開源了,下載代碼直接部署到Serverless就可以使用了,下載地址:
https://github.com/woodyyan/ffmpeg-composition
https://github.com/woodyyan/ffmpeg-splice
這里分為了兩個函數(shù),一個負(fù)責(zé)處理單個視頻,一個負(fù)責(zé)把多個視頻拼接成一個視頻并配上背景音樂。
目前支持以下功能:
1.在視頻中添加文字
2.視頻分辨率轉(zhuǎn)換
3.在視頻中添加圖片
4.視頻拼接
5.添加背景音樂
源碼里展示的只是常見的一些視頻剪輯場景,大家可以根據(jù)自己的業(yè)務(wù)需要,編寫自己的視頻剪輯邏輯。
方式一:Github Action自動部署
1.Fork倉庫。
2.在倉庫的Settings-Secrets-Actions中添加TENCENT_SECRET_ID和TENCENT_SECRET_KEY兩個密鑰。ID和KEY可以在騰訊云的訪問控制里面獲取。
3.添加之后,在Action中就可以發(fā)起部署了。每次修改代碼推送后,也會自動觸發(fā)Action部署。
4.如果需要有一些自定義的配置,請修改serverless.yml。
5.云函數(shù)最終會自動部署到TENCENT_SECRET_ID所在的賬號下。
方式二:云函數(shù)控制臺手動部署
1.下載代碼。
2.在根目錄把所有文件和文件夾一起打包成一個ZIP文件。
3.去云函數(shù)控制臺(https://console.cloud.tencent.com/scf/list),新建一個函數(shù)。
4.選擇從頭開始:
a.選擇python語言。
b.上傳ZIP文件。
c.函數(shù)內(nèi)存建議選擇較大的內(nèi)存。
d.開啟異步執(zhí)行。
e.執(zhí)行超時時間根據(jù)視頻大小建議設(shè)置長一點,比如30秒以上。
f.配置觸發(fā)器,選擇API網(wǎng)關(guān)觸發(fā)器,關(guān)閉集成響應(yīng)。
5.完成部署后,就可以通過API網(wǎng)關(guān)的URL開始調(diào)用了。
真實案例回顧
一個做網(wǎng)課的學(xué)校,需要每次在學(xué)生上完網(wǎng)課之后把上網(wǎng)課的錄像制作成一段30秒的視頻,作為學(xué)生的學(xué)習(xí)成果。
此案例有幾個關(guān)鍵的信息點:
1.通常一堂課有200個學(xué)生,需要同時制作200個視頻。
2.需要把1小時的上課視頻剪輯成30秒。
3.由于每個學(xué)生的上課屏幕有所不同,因此錄制的視頻都是不同的。
4.最終的成果視頻還需要加上學(xué)生的名字和頭像。
5.學(xué)生結(jié)束上課的時間很集中,因此制作視頻時會有短時高并發(fā)。
6.每次上完課的時候才會需要制作視頻,時段比較固定且集中。
綜合上述特點,用騰訊云Serverless云函數(shù)來做這樣的視頻剪輯帶來了多個好處:
1.解決了200個并發(fā)的問題,不需要自己搭建過多的服務(wù)器。
2.解決了只在發(fā)生時段使用的問題,其他時段都沒有成本產(chǎn)生。
3.解決了需要較強計算能力快速制作視頻的問題。
下面是這個案例的參考架構(gòu)圖:
總結(jié)
通過編排、組合、復(fù)用上面列舉的各種音視頻剪輯的場景,就能制作出各種各樣想要的效果。
然后把視頻剪輯中用來控制各種效果的參數(shù),變成調(diào)用服務(wù)時傳入的參數(shù),就能實現(xiàn)各種效果的定制化了。
最后再總結(jié)一下通過這種寫代碼的方式完成視頻剪輯的使用場景:
1.解決通過修改個別參數(shù)來批量制作視頻的場景。
2.解決通過用戶觸發(fā)來自動化制作視頻的場景。
3.解決不同場景需要不同定制化的制作視頻的場景。
同時,利用騰訊云Serverless云函數(shù)來完成視頻剪輯,同樣也解決了以下幾個問題:
1.因為通常視頻剪輯不是全天運行,利用騰訊云Serverless云函數(shù)按量付費的特性能優(yōu)化成本。
2.因為視頻剪輯通常是重計算場景,利用騰訊云Serverless云函數(shù)可選的高規(guī)格配置來應(yīng)對這種重計算場景。
3.在批量制作視頻的場景中通常會存在高并發(fā),利用騰訊云Serverless云函數(shù)自動彈性伸縮的特性能輕松應(yīng)對高并發(fā)。