短視頻錄制基本流程
同步的重要性
“BGM和人聲對(duì)不齊”,“BGM和嘴型對(duì)不齊”等等,同步問(wèn)題是用戶(hù)最容易感受到的,也是一個(gè)深度短視頻錄制者非常看重的;同時(shí),由于兼容性和產(chǎn)品功能的多樣性,比如seek、跳過(guò)前奏、原唱伴唱切換等等,非常容易出現(xiàn)且難以察覺(jué),甚至難以解決。下面我們就來(lái)分析,是什么導(dǎo)致不同步的問(wèn)題,以及如何解決。
問(wèn)題分析
我們常見(jiàn)的短視頻錄制的場(chǎng)景,以及要做的到的同步問(wèn)題
純音頻錄制(音頻K歌)
????主要是伴奏和人聲的同步
單視頻錄制(視頻K歌、短視頻錄制)
????主要是伴奏和人聲、錄制視頻同步,進(jìn)一步分解為伴奏和人聲的同步,和伴奏和視頻的同步。
多視頻錄制 (視頻合唱、視頻跟拍)
????主要是錄制視頻、跟拍視頻、伴奏和人聲同步,進(jìn)一步分解為伴奏和人聲的同步,伴奏和視頻的同 步,和錄制視頻和跟拍視頻的同步。
因此我們將短視頻錄制的同步問(wèn)題,分解為以下三個(gè)問(wèn)題,并一一分析和解決。
1、BGM和人聲的同步
2、BGM和視頻的同步
3、錄制視頻和跟拍視頻的同步
問(wèn)題解決
BGM和人聲的同步
同步非常難以解決的一個(gè)原因是很難直接量化,所以第一步我們要去量化它。
我們使用每隔兩秒滴一下的音頻作為BGM,打開(kāi)外放,這樣滴的聲音又會(huì)被重錄進(jìn)app中,這樣BGM滴的聲音的位置和重錄進(jìn)去滴一聲的位置的差,就是不同步時(shí)間差,一般要求
音視頻實(shí)驗(yàn)室:-100ms ~ 100ms
能夠量化后,接著我們要做到的是以下兩步:
1)保證寫(xiě)到本地的BGM和人聲數(shù)據(jù)量相同
2)保證BGM和人聲沒(méi)有錯(cuò)位
1、保證寫(xiě)到本地的BGM和人聲數(shù)據(jù)量相同
有兩方面,一方面是保證幀數(shù)相同,另一方面要保證bgm和人聲的pcm的采樣率相同,為后續(xù)混音,seek,裁剪等處理做準(zhǔn)備。
保證幀數(shù)相同業(yè)界有兩種方案:
1)輸入一幀(錄入)人聲,輸出一幀(播放)BGM。實(shí)現(xiàn)的方式比如說(shuō)IOS本身的AudioQueue和 Android類(lèi)似的實(shí)現(xiàn)oboe,都是通過(guò)一個(gè)線程去保證輸入一幀(錄入)音頻,輸出一幀(播放)音頻。
2)Android系統(tǒng)實(shí)現(xiàn)中,錄制器和解碼器是維護(hù)在不同線程中的,如何在兩個(gè)線程(錄制線程、解碼線程)中,保證BGM和人聲數(shù)據(jù)量相同。我們?cè)诮獯a器中維護(hù)了一個(gè)queue,里面緩存了解碼出來(lái)的音頻幀。解碼一幀音頻,放入queue中一幀;錄制出一幀音頻,從queue中取出一幀音頻。
保證采樣率相同,需要我們?cè)贐GM解碼后和錄制出數(shù)據(jù)后,增加重采樣的步驟。
2、錄制的人聲和BGM沒(méi)有錯(cuò)位
有以下原因會(huì)導(dǎo)致人聲和BGM錯(cuò)位
1)錄音器的輸入延遲和播放器的輸出延遲
人聲的錄入需要經(jīng)過(guò)以下階段:一段BGM先經(jīng)過(guò)播放器播放,人聽(tīng)到并同步的唱出,經(jīng)過(guò)錄制器,回到app中。
因此人聲的時(shí)間點(diǎn)與對(duì)應(yīng)的BGM的時(shí)間點(diǎn),必然是落后錄音器的輸入延遲 + 播放器的輸出延遲
因此我們需要開(kāi)始錄制時(shí)裁減掉開(kāi)始部分人聲,同時(shí)在錄制結(jié)束時(shí),用空數(shù)據(jù)補(bǔ)全缺少的人聲。
2)解碼速度如果低于錄制速度,就會(huì)導(dǎo)致BGM播放卡頓以及堵塞錄制線程。
錄制的輸入速度由硬件層保證,一定是輸出的數(shù)據(jù)量代表的錄制間隔(所以有的時(shí)候可以直接根據(jù)絕對(duì)時(shí)間變化,計(jì)算錄制pts)
解碼速度如何保證大于或者等于錄制的輸入速度呢?一方面及時(shí)是m4a的音頻的解碼速度一般也是快于20ms/幀的,另一方面更建議使用直接使用pcm。pcm可以是直接下載到或者在準(zhǔn)備過(guò)程中預(yù)解碼得到的。
同時(shí)如果使用pcm的話(huà),會(huì)使得seek變得更加精準(zhǔn)且快,但同時(shí)帶來(lái)交互上的成本或者下載成本。
3)warmup 音頻預(yù)熱
分input音頻預(yù)熱和output音頻預(yù)熱,難點(diǎn)在于app開(kāi)發(fā)者無(wú)法直接獲得,且不同設(shè)備差距很大。
針對(duì)這種情況,有一種方案是在線下通過(guò)之前介紹測(cè)量環(huán)路延遲的方法,測(cè)量top機(jī)型的整個(gè)環(huán)路延遲,在錄制過(guò)程中,根據(jù)測(cè)量的環(huán)路延遲,丟棄人聲的音頻幀。
但是這種方案并不能覆蓋所有機(jī)型,同時(shí)需要很大的成本去維護(hù)環(huán)路延遲機(jī)型表,所以我建議采取的手段可以是
通過(guò)假暫停減少多次音頻預(yù)熱出現(xiàn)
由于音頻預(yù)熱比較小,可以在對(duì)開(kāi)始錄制的地方,忽略音頻預(yù)熱
4)seek不精準(zhǔn)
使用精準(zhǔn)seek或者直接使用pcm數(shù)據(jù)
5)解碼器緩存和播放器緩存
在重新開(kāi)始錄制時(shí),要記得清楚解碼器緩存和播放器緩存,避免解碼器緩存和播放器緩存導(dǎo)致多余的BGM播放導(dǎo)致,錄制時(shí)間滯后BGM播放時(shí)間
事實(shí)上還有最后的兜底方案,也是業(yè)界內(nèi)比較常用的,就是在預(yù)覽頁(yè)允許用戶(hù)根據(jù)微調(diào)人聲和
最后,我們發(fā)現(xiàn)BGM和人聲的同步校準(zhǔn),并不是采用根據(jù)時(shí)間戳去校準(zhǔn),反而是嚴(yán)格保證音頻幀數(shù)據(jù)量一致且沒(méi)有錯(cuò)位來(lái)校準(zhǔn),這是由于人耳對(duì)音頻的敏感性,錄制中不能有丟幀。
BGM和視頻的同步
非常重要,但是也比較通用,大體有三個(gè)方案:
由于對(duì)聲音連續(xù)的要求高,所以基本不會(huì)考慮方案B。
錄制視頻和跟拍視頻的同步
目前有兩種方案:
方案一:
1、預(yù)覽時(shí),播放和錄制相互不影響;左邊播放原視頻,右邊播放camera返回的視頻。
2、合成時(shí),根據(jù)pts分別從原視頻和錄制視頻中,取出pts對(duì)應(yīng)的視頻幀,再合并在一起。
方案二:
1、預(yù)覽時(shí),從原視頻按照錄制的pts取對(duì)應(yīng)的視頻幀,和錄制的視頻幀,先一起繪制在一個(gè)framebuffer上,再展示在屏幕上和經(jīng)過(guò)編碼寫(xiě)到文件中。
2、無(wú)合成過(guò)程。
因此在短視頻錄制場(chǎng)景,建議優(yōu)先使用方案二。