縮圖調查——抖音客戶端/PC/iphone
最近對抖音有點上癮,經常看到這樣的視訊列表:
由於抖音平臺的限制,使用者最多隻能上傳60s的視訊,因此分段為3個視訊。而在視訊列表的縮圖模式下,三個視訊的封面恰好組合成一張影象。這種方式比較符合審美標準。
接下來跟我一起探討一下怎麼實現,以及背後的原理。
1.驗證平臺
使用三個平臺進行測試視訊縮圖展示視訊——PC、iPhone、tiktok蘋果客戶端
2.如何將圖片疊加到視訊最前面
視訊拼接剪輯就不說了,那如何將圖片疊加到視訊序列前面呢?
由於圖片經常是jpeg編碼,而視訊呢通常是avc或hevc編碼,因此絕不能生搬硬套資料進行cat!介紹兩種方法進行操作:
2.1 比較傻和粗糙的方式
把圖片和視訊,都解碼成yuv資料,然後yuv資料進行資料拼接cat,再編碼,就形成了視訊序列。
2.2 比較簡潔的方式
來自於視訊拼接的原理,把jpeg變成一個視訊流,不就可以進行兩段視訊的拼接了嘛!
如何做?使用萬能工具ffmpeg!
這裡分兩小步:step1.圖片轉為視訊;step2.再與主視訊拼接。
step1:
ffmpeg.exe -i img.jpg -vcodec libx264 -s 720x1280 output_img.mp4
如上命令列中,-s指定了生成視訊的解析度,因為要與待拼接的真正主視訊解析度一致(其實不一致也是允許的)。
step2:
ffmpeg.exe -f concat -i filelist.txt -c:v copy -an output_video.mp4
其中,filelist.txt指定了檔案列表(內容格式網上去搜,一大堆資料),-c:v copy指視訊拷貝,-an指不要音訊。
2.3 其他說明:
1.圖片生成的那個視訊檔案其實只有一幀資料,幀型別為關鍵幀(I幀)。
2.兩個視訊concat後(其實就是資料的cat,並且需要符合mp4規範),會出現前兩幀都是IDR關鍵幀,如下所示:
3.在播放時,對於解碼器來說,需要先後初始化兩次再解碼,因為其內部前兩個I幀前都帶了SPS/PPS資料,來解碼不同編碼引數的編碼資料。
3.如上視訊拼接了,預覽時能展示封面圖片了嗎?——不一定!
這裡要說的是,因為每個平臺(Win/iPhone/Android/tiktok)機制不太一樣,預覽展示的不一定是首幀畫面!有些抽取首幀,而有些抽取最接近某個時刻的關鍵幀。
4.一些嘗試,生成不同的視訊檔案
test1. 圖片僅編碼一幀(I幀)行程視訊,後面再跟主視訊進行拼接
test2. 圖片編碼25次(1s的視訊),一幀I幀和後續共24幀的B幀和P幀,再與主視訊拼接
test3. 圖片編碼若干次,使達到5s,然後再與主視訊拼接
上面test1-test3利用圖片生成視訊方法類似,分別為:
ffmpeg.exe -r 25 -loop 1 -i img.jpg -vcodec libx264 -s 720x1280 -frames 1 -r 25 img_1f.mp4
ffmpeg.exe -r 25 -loop 1 -i img.jpg -vcodec libx264 -s 720x1280 -frames 25 -r 25 img_1s.mp4
ffmpeg.exe -r 25 -loop 1 -i img.jpg -vcodec libx264 -s 720x1280 -frames 125 -r 25 img_5s.mp4
其中,引數-r 25指以25fps讀取輸入檔案img.jpg,-loop 1指迴圈利用輸入檔案,-frames指欲編碼輸出的總幀數,後面跟著的 -r 25指輸出檔案的幀率,最後為輸出檔名(字尾名代表圖片的數量或時長)。
利用上面生成的視訊,與主視訊拼接,命令列為:
ffmpeg.exe -f concat -i filelist.txt -c:v copy -an output_xx.mp4
最終生成的視訊,利用工具進行分析,分別如下:
5.驗證結果
在三個平臺上驗證:PC(Win10),iPhone7, tiktok
結果公示:
1.圖片編碼為一個I幀,再跟主視訊進行拼接
PC——主視訊的首幀
iphone——圖片
tiktok——頻閃(圖片和主視訊守幀)
2.圖片編碼25次達到1s時間,再與主視訊拼接
PC——主視訊的首幀
iphone——圖片
tiktok——圖片
3.圖片編碼若干次,使達到5s時間,再與主視訊拼接
PC——圖片
iphone——圖片
tiktok——圖片
6.測試中的一些發現
1.蘋果手機環境下,上傳視訊到tiktok,會重編碼為h264,關鍵幀間隔時長為1s,並且編碼幀帶B幀,使用high profile檔次。更關鍵的是,使用了蘋果自身的硬體編碼器和封裝器。
如何看出來呢?上傳後,再下載下來。視訊檔案的MediaInfo資訊:
2.安卓機上傳,使用了x264(core 148)轉碼。
該條結論無直接證據,是間接得到的。因為隨機下載了幾個視訊,編碼引數(NAL unit type中的SEI資料)都是一致的。
3.上傳轉碼時,什麼場景下使用h265編碼,還不清楚。
&n