视频无缝续播的一些解决方案
前言
首先題圖是前段時間老家刷屏的日暈圖...
公號已經很久沒有更新了,突然想起之前一段時間更新頻繁的時候,有粉絲在后臺問我這么閑是不是自由工作者的問題。事實上我并不是自由工作者,我也是眾多打工大軍中平平凡凡的一員,只是之前在找工作,除了出去面試就是整理一下以前學習過一些技術要點,順帶發表共享一下而已。而最近因為到了新公司,忙于新公司的業務工作,所以斷更了一段時間。
在最近的一篇文章中我寫了《WebRTC專題開篇》這個預告,本來打算記錄一下自己在WebRTC這個領域的一些學習心得和筆記的,但是礙于新公司業務可能比較忙,而且對于WebRTC這個專題的知識我也是在摸著石頭過河的學習階段,為了避免寫出來的文章誤人子弟,我決定緩一緩,再細心學習整理一下再給大家更新,因為本人的學藝不精導致的拖更是在抱歉。
無縫續播切換
現如今互聯網最火的兩大領域一個是人工智能,另一個就是以抖音、火山小視頻為首的短視頻APP。我們在使用這些短視頻APP的時候又一個很好的體驗就是從一個視頻的播放從一個界面跳轉到另外一個頁面的時候視頻總是能無縫銜接,不會出現重新加載播放的現象。所以今天我們就來聊音視頻的無縫銜接播放的問題。
對于音視頻的無縫續播主要是兩個方面:
一個是界面切換時的無縫續播,另外一個切換視頻播放源時的無縫續播。
界面切換無縫續播
對于界面切換時的無縫續播,業界大致有兩種解決方案:
其中一種解決方案是替換播放器渲染的surfaceView的方式,另外一種解決方案是使用移動播放器View的方式,也就是將播放器的渲染View從原先的布局中移除掉,然后插入到要顯示的布局中。
對于使用切換surfaceView的原理是解碼器動態關聯不同的渲染視圖(RenderView),比如使用MediaPlayer動態關聯SurfaceView,就如同一個電腦主機不斷連接不同的顯示器。典型的開源項目是?(GSYVideoPlayer)https://github.com/CarGuo/GSYVideoPlayer
但是這種方案有一個狀態同步的問題,比如說目前播放器是暫停的,那么切換surfaceView的時候需要將暫停時的那一幀圖像繪制到新的surfaceView上,播放完畢也是同理。比如有這樣的一個需求,一個RecyclerView的視頻播放列表,點擊跳轉到了詳情頁的時候就把播放器的surfaceView切換到了詳情頁的surfaceView,那么當詳情頁播放完畢之后,當用戶點擊返回按鈕時,需要重新把surfaceView設置成RecyclerView條目中的surfaceView,那么這時就需要將視頻的最后一幀圖像渲染到新的surfaceView上。總的來說就是需要保證播放器的surfaceView在切換前和切換后顯示的圖像內容是一樣的。這個是一個重難點。
至于使用移動View的方式進行界面無縫續播的方案,可能會導致View缺失的問題,導致播放界面可能會出現空白,特別是列表播放的需求情景。需要精確地管理播放器View當前所在的布局,而且在不同的Activity或者Fragment隨意移動穿插View,處理不好的話可能會出現內存泄露的問題。這種解決方案的開源項目代表有(JiaoZiVideoPlayer)https://github.com/lipangit/JiaoZiVideoPlayer
對于以上兩種方案,一句話總結就是:如果播放器邏輯層和視頻幀渲染層分離管理得當的話,一個就是管理View的問題,另外一個就是管理渲染狀態的問題。
碼流切換無縫續播
對于無縫切換碼流主要分為單個播放器和多個播放器的方案:
單個播放器的方案:
點擊切換碼流時,不銷毀播放器,只是暫停解碼。開始請求新的url中數據,然后將重新下載到的流媒體數據送給解碼器,重新啟動解碼,然后渲染輸出。達到無縫切換的效果。
多個播放器的方案:
在點擊切換碼流的時候,讓原來的播放器繼續工作,然后新開一個播放器后臺異步準備新的播放源,準備完畢后,使用新的播放器seek到原來的播放器播放的時間位置,最后顯示新的播放器,隱藏并銷毀原來的舊播放器,以達到無縫切換的效果。
但是對于很多播放器來說一般都是不能seek到非關鍵幀的位置的,一旦播放的視頻兩個關鍵幀之間相差好幾秒,而要seek的位置又剛好不是關鍵幀的位置時,可能就會看到有明顯的跳幀感覺。所以說如果要達到比較好的碼流切換無縫銜接續播的效果的話可能需要在解碼階段做一些處理比較合適。
技術交流,歡迎加我微信:ezglumes ,拉你入技術交流群。
掃碼關注公眾號【音視頻開發進階】,一起學習多媒體音視頻開發~~~
喜歡就點個「在看」吧?▽
總結
以上是生活随笔為你收集整理的视频无缝续播的一些解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 必应缤纷桌面
- 下一篇: dw读取access中的图片_Dream