1. 程式人生 > >直播-視訊流無縫切換

直播-視訊流無縫切換

方式一: 1、通常一種切換碼流方式,如系統播放器切換碼流,先Stop,再Create Player,再onPrepare,再Start 方式二: 2、實際上還有一種無縫切換碼流,如果是單例項播放器,點選切換碼流時,不銷燬播放器器,只是暫停解碼。開始請求新的url中資料,比如下載了有1-2片TS流後,重新送給解碼器,重新啟動解碼,然後渲染輸出。達到無縫輸出的效果。 方式三: 3、如果是多例項播放器,總的實現思路是:用兩個MediaPlayer 兩個 SurfaceView. 首先讓一個Mediaplayer 播一個視訊,一般播一個小視訊,這樣不佔資源,這個MediaPlayer播放的時候,讓它Stop在這裡,可以讓這個MediaPlayer 隱藏掉 ,注意不要Reset或者Release這個MediaPlayer 。然後可以讓另外一個MediaPlayer 播放視訊, 這個時候這個MediaPlayer 切換視訊資源的時候就不會出現黑屏的現象。達到無縫效果,至於之間播放到哪個位置,很簡單,可以用儲存起來,另外一個MediaPlayer播放時,如果有去取下這個資料,起播後,SeekTo到對應位置。然後Start。一樣是無縫。 方式四:
4、以前有參考過一個專利,思路是這樣的(實際也是用了多例項): 視訊流採集終端收到使用者終端的規格切換請求後,保持原編碼器例項繼續執行,並啟動一個新編碼器例項;再將新視訊流與原視訊流進行幀號同步;然後在新視訊流中選擇一個關鍵幀,並從該關鍵幀開始向用戶終端傳送新視訊流,原視訊流傳送完該關鍵幀的上一幀資料後結束,且該關鍵幀的幀號與原視訊流的最後一個關鍵幀的幀號之間的間距大於新視訊流GOP長度的1/2;然後再關閉原編碼器例項。 具體步驟: a、保持原編碼器例項繼續執行,並按使用者終端所請求的新規格啟動一個新編碼器例項,其中的原編碼器例項是指使用者終端上一次所請求的原規格的編碼器例項; b、將新視訊流與原視訊流進行幀號同步,使該兩個視訊流中的各個相同內容的幀一一對應;其中,新視訊流是指新編碼器例項輸出的視訊流,原視訊流是指原編碼器例項輸出的視訊流; c、在新視訊流中選擇一個關鍵幀,並從該關鍵幀開始向用戶終端傳送新視訊流,原視訊流傳送完該關鍵幀的上一幀資料後結束,且該關鍵幀的幀號與原視訊流的最後一個關鍵幀的幀號之間的間距大於新視訊流GOP長度的1/2; d、關閉原編碼器例項,空出編碼器硬體資源,準備下一次切換。

https://mp.weixin.qq.com/s/rYhBiVQaHMhWAnAUbyqnxQ