縮略圖調查——抖音客戶端/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 720×1280 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 720×1280 -frames 1 -r 25 img_1f.mp4
        ffmpeg.exe -r 25 -loop 1 -i img.jpg -vcodec libx264 -s 720×1280 -frames 25 -r 25 img_1s.mp4
        ffmpeg.exe -r 25 -loop 1 -i img.jpg -vcodec libx264 -s 720×1280 -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.Android機上傳,使用了x264(core 148)轉碼。

         該條結論無直接證據,是間接得到的。因為隨機下載了幾個影片,編碼參數(NAL unit type中的SEI數據)都是一致的。

         

      3.上傳轉碼時,什麼場景下使用h265編碼,還不清楚。