仿剪映播放器、剪輯視頻、預覽條、快速精準
給大家分享一下知識星球里面小伙伴的項目實踐,高仿剪映快速抽幀、精準顯示功能,而且還有源碼給出!
關于實現思路,之前也在公眾號里面給大家分享過:
有興趣有時間的,也可以按照思路自己動手實踐一下,以下是特意邀請作者寫的分享,歡迎交流討論!
由于本人想學習音視頻相關的東西,所以找了剪映作為借鑒,通過仿照剪映的功能學習音視頻相關的東西,所以有了這個項目。
暫時這個項目只有仿照剪映編輯的預覽條快速抽幀、精準顯示,以及播放器的播放和隨預覽條的滾動逐幀預覽。
本項目的抽幀顯示速度和剪映還有一定的差距,但是和快影的抽幀速度差不多了。
本項目主要有三塊:
第一部分是使用的 開源的 ,也就是預覽條的UI。
第二部分是視頻播放器,使用 寫的一個簡單的播放器,將與數據交給 Java 層的 去渲染顯示。
第三部分是預覽條的解碼抽幀,也是通過 去解碼,然后結合 UI 去處理解碼的時機,顯示,緩存等問題。
項目地址,歡迎 star :
開局一張圖
這是剪映的預覽條抽幀效果
這是快手的快影預覽抽幀效果下面兩個動圖是本項目的預覽抽幀效果大概的思路
某位大佬曾經分析過類似剪映預覽條抽幀的思路:
1.每一個要顯示的幀的時間是確定的,因為間隔是固定的。
2.既然要顯示的幀的時間是確定的,那么在實際要顯示的時候,可以根據要即將要解碼的幀與當 前已解碼的幀是否在同一個GOP,如果在同一個GOP,那么就通過順序解碼的方式。如果不在同一個GOP,那么就要先seek,再順序解碼到需要的幀。
3.因為預覽條上面顯示的每一幀的實際寬高都非常小,所以可以將壓縮到很小,大概10kb以內,這樣就可以充分利用緩存,提前解碼放入緩存,加快顯示的速度。這里不僅可以用內存緩存,還可以用磁盤緩存,已經解碼的可以存到磁盤,下次就可以直接拿。
4.充分利用多解碼器解碼,或者多線程解碼。
5.解析nal 獲取 語法元素的值,如果為0,則可以丟棄不解碼,因為2bit的,標識NALU的重要性,值越大,重要性越高。當解碼器處理不過來時,可以丟掉重要性為0的。
pe
1 bit
2 bit
5 bit
以上就是大致的一個思路,本項目也基本使用的是這個思路,稍有不同的是,第3點,本項目只用了磁盤緩存,并且沒有使用提前解碼的方式,而是通過獲取當前顯示再屏幕上的item,所屬的時間范圍,只解碼這個范圍內的部分(剪映基本也是這么處理的)。
同時本項目會在拿到需要處理的視頻,初始化后,將當前視頻所有I幀的時間節點獲取出來,以便在后面判斷是需要順序解碼,還是需要seek。
這里就沒有貼代碼了,重點在思路,想看代碼和效果的可以去下載下來,跑一跑。
本項目僅僅一個demo,沒有做兼容,沒有做架構,所以不能直接用于正式項目,然后也希望找一些同好們,一起學習交流。
最后歡迎大家加入 音視頻開發進階 ,這里有知識干貨、編程答疑、開發教程,還有很多精彩分享。
更多內容可以在星球菜單中找到,隨著時間推移,干貨也會越來越多?。。?/p>
給出 10元 優惠券,漲價在即,目前還是白菜價,基本上提幾個問題就回本,投資自己就是最好的投資?。?!
加我微信 ,拉你進技術交流群
聲明:本站所有文章資源內容,如無特殊說明或標注,均為采集網絡資源。如若本站內容侵犯了原著者的合法權益,可聯系本站刪除。