縮略圖調查——抖音客戶端/PC/iphone

最近對抖音有點上癮,常常看到這樣的視頻列表: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編碼,還不清楚。

相關文章
相關標籤/搜索