最近對抖音有點上癮,常常看到這樣的視頻列表:iphone
因爲抖音平臺的限制,用戶最多隻能上傳60s的視頻,所以分段爲3個視頻。而在視頻列表的縮略圖模式下,三個視頻的封面剛好組合成一張圖像。這種方式比較符合審美標準。ide
接下來跟我一塊兒探討一下怎麼實現,以及背後的原理。工具
1.驗證平臺oop
使用三個平臺進行測試視頻縮略圖展現視頻——PC、iPhone、tiktok蘋果客戶端測試
2.如何將圖片疊加到視頻最前面編碼
視頻拼接剪輯就不說了,那如何將圖片疊加到視頻序列前面呢?spa
因爲圖片常常是jpeg編碼,而視頻呢一般是avc或hevc編碼,所以毫不能生搬硬套數據進行cat!介紹兩種方法進行操做:命令行
2.1 比較傻和粗糙的方式code
把圖片和視頻,都解碼成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編碼,還不清楚。