1. 程式人生 > >縮圖調查——抖音客戶端/PC/iphone

縮圖調查——抖音客戶端/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