聊聊視頻播放那些事2
阿新 • • 發佈:2018-08-15
其中 ret bool 動畫 void 解決問題 activit 初始化 strong
MediaPlayer 工作邏輯了解一下
隨便畫了一下圖幫助理解。
打個比喻,mediaplayer 可以為電影播放機。各種view是他的屏幕。回調事件可以理解為電影播放員。
繼續聊無逢播放。
第一個頁面在播的視頻全屏以後或者跳第二頁繼續無逢播放。
直接的想法是,開始頁面播了多少,進到第二頁面接著上個播放點繼續播。進入第二頁後臺,初始化mediaPlayer ,setResouce,setSurface ,start,seek到播放點。
會發現這個過程時間很長,轉圈圈要好久,這並不是產品經理想要的。
要解決問題
以下內容了解一下。
第一:mediaPlayer應該單例工作。看mediaplayer源碼,其中很多功能是natvie實現。他的工作是獲取流並解碼,形成圖像流並展示在界面上。畫圖像流可以用surface Glsurface textrueView等 。
第二:mediaPlayer應該在線程工作。
第三:回調事件工作在UI線程。
試問以下問題。
MediaPlayer開始工作以後,"屏幕能不能換"?
MediaPlayer開始工作以後,"放影人能不能換"?
答案是可以的。
假設使用TextureView作為“銀幕”,在場景1使用TextureView1 ,在場景2使用TextureView2,這個操作完全沒有問題。
在MediaPlayer開始工作以後,重新設置各種 listener也是沒有問題的。
那麽:MediaPlayer播放不依賴於UI線路程,page1跳到page2 MediaPlayer播放不停,更換“銀幕”和“放影人”就可以。
看效果,貼代碼:
package com.example.administrator.videotest; import android.annotation.SuppressLint; import android.content.Intent; import android.graphics.SurfaceTexture; import android.media.MediaPlayer; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Surface;import android.view.TextureView; import android.view.View; import android.widget.Button; public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Button button = findViewById(R.id.bt); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(Main2Activity.this, Main3Activity.class); startActivity(i); } }); } @Override protected void onResume() { super.onResume(); StaticHolder.textureView = findViewById(R.id.tv); StaticHolder.textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { initMediaPlayer(new Surface(surface)); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } }); } //聲明成靜態,第二頁接著用。 static public MediaPlayer mediaPlayer; @SuppressLint("NewApi") public void initMediaPlayer(Surface surface) { try { mediaPlayer = MediaPlyerHelper.getMediaPlayer(); mediaPlayer.setSurface(surface); mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { } }); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mp.start(); } }); mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { return false; } }); //AssetFileDescriptor fileDescriptor = getAssets().openFd("sample.mp4"); mediaPlayer.setDataSource("https://mov.bn.netease.com/open-movie/nos/mp4/2016/01/11/SBC46Q9DV_hd.mp4"); mediaPlayer.prepare(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } }); } catch (Exception e) { e.printStackTrace(); } } }
package com.example.administrator.videotest; import android.graphics.SurfaceTexture; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Surface; import android.view.TextureView; public class Main3Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); TextureView rl = findViewById(R.id.tv); rl.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { Main2Activity.mediaPlayer.setSurface(new Surface(surface)); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } }); } }
怎麽樣基本無逢跳轉。
先到這兒下篇更多內容,制作《騰訊新聞》視頻列表及相應動畫。
聊聊視頻播放那些事2