引言
開始講之前先解決大家看到這個標題時心里的3個疑惑:
是Adobe等軟件無法完成的
大家平常接觸到的視頻剪輯通常都是使用、AE等這類專業工具來完成視頻剪輯。他們能完成一些復雜的效果,比如做宣傳視頻,廣告視頻等。
但有些企業在某些業務場景下是期望能批量且自動化的完成視頻剪輯。
比如以下幾種場景:
假設學校期望能在學生上完網課之后馬上呈現所有學生學習過程中的精彩視頻,配上學校的logo和宣傳語等,讓學生一鍵分享自己的成果。假設有1萬個學生,需要為每個學生制作獨一無二的視頻,所以需要批量且自動化的完成1萬個不同的視頻剪輯。
某次營銷活動中,需要為不同的用戶生成不同的頭像視頻來吸引用戶參與。每個用戶的頭像都是獨一無二的,生成的視頻也是獨一無二的,用戶可能成千上萬,因此自動化完成是必須的條件。
網紅運營公司期望能給所有主播生成統一的營業視頻。可能有100個主播,專門找一個人剪輯100個視頻好像勉強能接受,但如果每周都要剪一次不同的視頻呢?所以自動化,批量和可定制化的剪輯就成了主要需求。
以上的場景中有三個特點:
對于符合以上特點的場景,是傳統的視頻剪輯工具或者模版化的視頻處理軟件無法輕松完成的。
二、為什么推薦用
因為視頻剪輯這樣的業務有幾個特點:
單獨購買高規格的服務器利用率很低圖片批量加logo軟件,買便宜的服務器計算能力又跟不上。
因此按量計費的特點,以及高性能的計算能力,完美匹配了這樣的需求場景。
既能達到100%的利用率圖片批量加logo軟件,又能按量使用它的高性能計算能力。同時,騰訊云云函數擁有多變的可編程環境,可以使用任意熟悉的編程語言,靈活性很高。
三、如何通過寫代碼做視頻剪輯
本文章提到的所有視頻剪輯的功能,都是用這個工具,先給大家講講什么是。
()是一個用來做視頻處理的開源工具,它有非常強大的功能,它支持視頻剪輯、視頻轉碼、視頻編輯、音頻處理、添加文字、視頻拼接、拉流推流直播等功能。
我們通過不同的命令就可以編程完成不同的視頻剪輯功能,組合編排起來,就可以應對各種批量自動化的場景了。
四、視頻剪輯批量化、自動化與定制化實踐
常見的視頻剪輯場景主要包含以下幾種:
接下來給大家展示一些具體的命令例子,如果你在本地安裝了,也可以在本地執行這些命令。關于怎么安裝,可以去看官網的教程()。
// 將MOV視頻轉成mp4視頻
ffmpeg -i input.mov output.mp4
// 將原視頻的幀率修改為24
ffmpeg -i input.mp4 -r 24 -an output.mp4
// 將mp4視頻轉為可用于直播的視頻流
ffmpeg -i input.mp4 -codec: copy -bsf:v h264_mp4toannexb -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8
// 將視頻分別變為480x360,并把碼率改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
// 給視頻添加文字,比如字幕、標題等。
// `fontfile`是要使用的字體的路徑,`text`是你要添加的文字,
// `fontcolor`是文字的顏色,`fontsize`是文字大小,`box`是給文字添加底框。
// `box=1`表示enable,`0`表示disable,`boxcolor`是底框的顏色,black@0.5表示黑色透明度是50%,`boxborderw`是底框距文字的寬度
// `x`和`y`是文字的位置,`x`和`y`不只支持數字,還支持各種表達式,具體可以去官網查看
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表示復合的濾鏡,overlay表示表示圖片的x和y,enable表示圖片出現的時間段,從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里面按順序放所有要拼接的視頻的文件路徑,如下。
// 注意,如果視頻的分辨率不一致會導致拼接失敗。
ffmpeg -f concat -safe 0 -i list.txt -c copy -movflags +faststart output.mp4
// list.txt的格式如下
file 'xx.mp4'
file 'yy.mp4'
// 視頻加音頻,stream_loop表示是否循環音頻內容,-1表示無限循環,0表示不循環。shortest表示最短的MP3輸入流結束時完成編碼。
ffmpeg -y -i input.mp4 -stream_loop -1 -i audio.mp3 -map 0:v -map 1:a -c:v copy -shortest output.mp4
能做的事情非常多,這里就不一一講解了。更多的玩法可以在官網上探索。
對于音頻的編輯也是同樣的道理,也支持單獨對音頻進行編輯。
五、運行命令
因為運行這些命令比較便捷,所以我們可以使用來運行所有的命令。
同時,在騰訊云云函數上運行性能也比較好,部署也方便。
通過來使用的視頻剪輯代碼在文章最后有開源鏈接,并且,在官網上也有模版可以直接使用,幾乎覆蓋了常見的音視頻剪輯等操作。
這里就展示一個簡單的調用代碼示例:
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)
六、在部署
上面提到的常見的視頻剪輯場景我已經實現并開源了,下載代碼直接部署到就可以使用了,下載地址:
這里分為了兩個函數,一個負責處理單個視頻,一個負責把多個視頻拼接成一個視頻并配上背景音樂。
目前支持以下功能:
源碼里展示的只是常見的一些視頻剪輯場景,大家可以根據自己的業務需要,編寫自己的視頻剪輯邏輯。
(一)方式一: 自動部署
(二)方式二:云函數控制臺手動部署
七、真實案例回顧
一個做網課的學校,需要每次在學生上完網課之后把上網課的錄像制作成一段30秒的視頻,作為學生的學習成果。此案例有幾個關鍵的信息點:
綜合上述特點,用騰訊云云函數來做這樣的視頻剪輯帶來了多個好處:
下面是這個案例的參考架構圖:
總結
通過編排、組合、復用上面列舉的各種音視頻剪輯的場景,就能制作出各種各樣想要的效果。
然后把視頻剪輯中用來控制各種效果的參數,變成調用服務時傳入的參數,就能實現各種效果的定制化了。
最后再總結一下通過這種寫代碼的方式完成視頻剪輯的使用場景:
同時,利用騰訊云云函數來完成視頻剪輯,同樣也解決了以下幾個問題: