1. 程式人生 > >聊聊視頻播放那些事2

聊聊視頻播放那些事2

其中 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