Android VideoPlayer

一、Android 視頻播放的幾種方法

1、VideoView 播放組件
(1)佈局xml中添加VideoView組件

  <VideoView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/VideoView"
    />

(2)AndroidManifest文件
添加訪問sd卡權限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
橫屏 android:screenOrientation="landscape"
去掉ActionBar android:theme="@style/Theme.AppCompat.Light.NoActionBar"
(3)MainActivity.java

public class MainActivity extends Activity {
    private VideoView videoView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        videoView = findViewById(R.id.VideoView);
        videoView.setVideoPath("/mnt/shared/other/family.mp4");     //設置視頻路徑
        videoView.start();
        MediaController mediaController = new MediaController(MainActivity.this,true);   //設置控制器
        videoView.setMediaController(mediaController);    //用控制器初始化videoview
    }
}

2、MediaPlayer + SurfaceView
(1)視頻文件ocean.mp4放置於res目錄下的raw目錄中,由於surfaceView的創建需要一定的時間,因此調用addCallback,在其創建完成時,播放器設置播放幕布並進行播放。
(2)佈局XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <SurfaceView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/surfaceView"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暫停"
        android:id="@+id/pause"
        android:layout_alignParentBottom="true"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放"
        android:id="@+id/play"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"/>

</RelativeLayout>

(3)MainActivity.Java

public class MainActivity extends Activity {
    private SurfaceView surfaceView;   //播放幕布
    private MediaPlayer mediaPlayer;  //播放器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        surfaceView = findViewById(R.id.surfaceView);
        mediaPlayer = MediaPlayer.create(MainActivity.this,R.raw.ocean);

        //surfaceView的創建需要一定的時間
        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                mediaPlayer.setDisplay(surfaceView.getHolder());
                mediaPlayer.start();
            }

            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

            }
        });

        findViewById(R.id.pause).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mediaPlayer.pause();
            }
        });

        findViewById(R.id.play).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mediaPlayer.start();
            }
        });
    }
}    

在這裏插入圖片描述
3、MediaPlayer + SurfaceView + MediaController
(1)佈局XML
只有一個SurfaceView組件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/root">

    <SurfaceView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/surfaceView"
        />

</RelativeLayout>

(2)MainActivity.java
自己定義MediaController,相當於將MediaPlayer 的控制交給MediaController。

public class MainActivity extends Activity implements MediaController.MediaPlayerControl {
    private SurfaceView surfaceView;   //播放幕布
    private MediaPlayer mediaPlayer;
    private MediaController mediaController;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        surfaceView = findViewById(R.id.surfaceView);
        mediaPlayer = MediaPlayer.create(MainActivity.this,R.raw.ocean);

        //surfaceView的創建需要一定的時間
        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                mediaPlayer.setDisplay(surfaceView.getHolder());
                mediaPlayer.start();
            }

            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

            }
        });

        mediaController = new MediaController(MainActivity.this);
        mediaController.setMediaPlayer(MainActivity.this);
        mediaController.setAnchorView(findViewById(R.id.root));
        mediaController.setEnabled(true);
    }

    @Override
    public void start() {
        mediaPlayer.start();
    }

    @Override
    public void pause() {
        mediaPlayer.pause();
        //顯示廣告、開通會員等
    }

    @Override
    public int getDuration() {
        return mediaPlayer.getDuration();
    }

    @Override
    public int getCurrentPosition() {
        return mediaPlayer.getCurrentPosition();
    }

    @Override
    public void seekTo(int i) {
        mediaPlayer.seekTo(i);
    }

    @Override
    public boolean isPlaying() {
        return mediaPlayer.isPlaying();
    }

    @Override
    public int getBufferPercentage() {
        return 0;
    }

    @Override
    public boolean canPause() {
        return true;
    }

    @Override
    public boolean canSeekBackward() {
        return true;
    }

    @Override
    public boolean canSeekForward() {
        return true;
    }

    @Override
    public int getAudioSessionId() {
        return 0;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mediaController.show();  //顯示mediaController

        //將觸摸事件交給mediaController去處理而不是activity
        return mediaController.onTouchEvent(event);
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章