MediaPlayer memainkan audio dan video


Pengenalan kepada bahagian ini:

Bahagian ini membawakan MediaPlayer dalam multimedia Android Kami boleh memainkan audio dan video melalui API ini Kelas ini merupakan komponen penting dalam rangka kerja multimedia Androd Melalui kelas ini, kita boleh mendapatkan dan menyahkod dalam langkah terkecil. dan mainkan audio dan video. Ia menyokong tiga sumber media yang berbeza:

  • Sumber tempatan
  • URI Dalaman, contohnya, anda boleh mendapatkan
  • URL luaran (strim) melalui ContentResolver Untuk senarai format media yang disokong oleh Android

Untuk senarai format media yang disokong oleh Android, lihat: Format Media yang Disokong Dokumen

Kami akan menggunakannya dalam bahagian ini MediaPlayer untuk menulis contoh mudah memainkan audio dan video!

Dokumentasi API rasmi: MediaPlayer


1 Penjelasan terperinci tentang kaedah berkaitan


1) Dapatkan MediaPlayer contoh:

Anda boleh arahkan baharu atau panggil kaedah buat untuk mencipta:

MediaPlayer mp = new MediaPlayer();
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);  //无需再调用setDataSource

Selain itu, buat juga mempunyai borang ini: buat(Konteks konteks, Uri uri, pemegang SurfaceHolder)Buat pemain multimedia melalui Uri dan nyatakan SurfaceHolder [Kelas abstrak]


2) Tetapkan fail main balik:

//①raw下的资源:
MediaPlayer.create(this, R.raw.test);

//②本地文件路径:
mp.setDataSource("/sdcard/test.mp3");

//③网络URL文件:
mp.setDataSource("http://www.xxx.com/music/test.mp3");

Selain itu setDataSource( ) kaedah, yang mengandungi jenis parameter sedemikian: FileDescriptor, apabila menggunakan ini Apabila menggunakan API, anda perlu meletakkan fail ke dalam folder aset pada tahap yang sama dengan folder res, dan kemudian gunakan kod berikut untuk menetapkan Sumber Data:

AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());

3) Kaedah lain

  • getCurrentPosition( ): Dapatkan kedudukan main semasa
  • getDuration(): Dapatkan masa fail
  • getVideoHeight(): Dapatkan ketinggian video
  • getVideoWidth(): Dapatkan lebar video
  • isLooping(): Sama ada hendak menggelung main balik
  • isPlaying(): Sama ada hendak main balik
  • jeda (): Jeda
  • sediakan(): Sediakan (segerak)
  • sediakanAsync(): Sediakan (tak segerak)
  • release(): Lepaskan objek MediaPlayer
  • reset(): Tetapkan semula objek MediaPlayer
  • seekTo( int msec) : Tentukan kedudukan main balik (masa dalam milisaat)
  • setAudioStreamType(int streamtype): Tentukan jenis media penstriman
  • setDisplay (SurfaceHolder sh) : Tetapkan untuk menggunakan SurfaceHolder untuk memaparkan multimedia
  • setLooping(gelung boolean): Tetapkan sama ada untuk menggelung main balik
  • setOnBufferingUpdateListener(MediaPlayer(MediaPlayer .OnBufferingUpdateListener pendengar): Mendengar penimbal untuk media penstriman rangkaian
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listener): Pemantauan tamat main balik media penstriman rangkaian
  • setOnErrorListener(MediaPlayer.OnErrorListener listener): Tetapkan pendengar mesej ralat
  • setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener): Pemantauan saiz video
  • setScreenOnWhilePlaying(skrin booleanHidup): Tetapkan sama ada hendak menggunakan SurfaceHolder untuk memaparkan
  • setVolume(float leftVolume, float rightVolume): Set kelantangan
  • mula(): Mula bermain
  • berhenti(): Berhenti bermain

2. Gunakan contoh kod

Contoh 1: Gunakan MediaPlayer untuk memainkan audio:

Jalankan pemaparan :

1.png

Kod kunci:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_play;
    private Button btn_pause;
    private Button btn_stop;
    private MediaPlayer mPlayer = null;
    private boolean isRelease = true;   //判断是否MediaPlayer是否释放的标志

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
    }

    private void bindViews() {
        btn_play = (Button) findViewById(R.id.btn_play);
        btn_pause = (Button) findViewById(R.id.btn_pause);
        btn_stop = (Button) findViewById(R.id.btn_stop);

        btn_play.setOnClickListener(this);
        btn_pause.setOnClickListener(this);
        btn_stop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_play:
                if(isRelease){
                    mPlayer = MediaPlayer.create(this,R.raw.fly);
                    isRelease = false;
                }
                mPlayer.start();   //开始播放
                btn_play.setEnabled(false);
                btn_pause.setEnabled(true);
                btn_stop.setEnabled(true);
                break;
            case R.id.btn_pause:
                mPlayer.pause();     //停止播放
                btn_play.setEnabled(true);
                btn_pause.setEnabled(false);
                btn_stop.setEnabled(false);
                break;
            case R.id.btn_stop:
                mPlayer.reset();     //重置MediaPlayer
                mPlayer.release();   //释放MediaPlayer
                isRelease = true;
                btn_play.setEnabled(true);
                btn_pause.setEnabled(false);
                btn_stop.setEnabled(false);
                break;
        }
    }
}

Nota:

memainkan fail audio dalam direktori res/raw dan mencipta Panggilan MediaPlayer Ia adalah kaedah cipta, sebelum memulakan main semula buat kali pertama Tidak perlu memanggil semula prepare() Jika ia dibina menggunakan kaedah pembina, anda perlu memanggil kaedah prepare() sekali. Turut dipaparkan dalam dokumentasi rasmi ialah kod contoh untuk memainkan audio daripada dua saluran lain:

Uri Tempatan:

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

URL Luaran:

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

Nota: Jika anda menstrim fail audio dalam talian melalui URL, fail tersebut mesti boleh dimainkan Muat Turun Progresif


Contoh 2: Gunakan MediaPlayer untuk memainkan video

MediaPlayer terutamanya digunakan untuk memainkan audio dan tidak menyediakan antara muka output imej, jadi kita perlu menggunakan lain Komponen untuk memaparkan output imej yang dimainkan oleh MediaPlayer, kami boleh menggunakan SurfaceView untuk memaparkannya di bawah kami menggunakan SurfaceView untuk menulis contoh main balik video:

Menjalankan rendering. :

2.png

Kod pelaksanaan:

Fail reka letak: activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <SurfaceView
        android:id="@+id/sfv_show"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

    <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始" />

    <Button
        android:id="@+id/btn_pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂停 " />

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="终止" />
    </LinearLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener, SurfaceHolder.Callback {

    private MediaPlayer mPlayer = null;
    private SurfaceView sfv_show;
    private SurfaceHolder surfaceHolder;
    private Button btn_start;
    private Button btn_pause;
    private Button btn_stop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
    }

    private void bindViews() {
        sfv_show = (SurfaceView) findViewById(R.id.sfv_show);
        btn_start = (Button) findViewById(R.id.btn_start);
        btn_pause = (Button) findViewById(R.id.btn_pause);
        btn_stop = (Button) findViewById(R.id.btn_stop);

        btn_start.setOnClickListener(this);
        btn_pause.setOnClickListener(this);
        btn_stop.setOnClickListener(this);

        //初始化SurfaceHolder类,SurfaceView的控制器
        surfaceHolder = sfv_show.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setFixedSize(320, 220);   //显示的分辨率,不设置为视频默认

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start:
                mPlayer.start();
                break;
            case R.id.btn_pause:
                mPlayer.pause();
                break;
            case R.id.btn_stop:
                mPlayer.stop();
                break;
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mPlayer = MediaPlayer.create(MainActivity.this, R.raw.lesson);
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mPlayer.setDisplay(surfaceHolder);    //设置显示视频显示在SurfaceView上
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {}

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPlayer.isPlaying()) {
            mPlayer.stop();
        }
        mPlayer.release();
    }
}

Kod ini sangat mudah Reka letak mempunyai SurfaceView, dan kemudian memanggil getHolder untuk mendapatkan objek SurfaceHolder. Lengkapkan tetapan berkaitan SurfaceView di sini, tetapkan resolusi paparan dan antara muka Panggilan Balik. Mengatasi tiga kaedah SurfaceView apabila ia dibuat, apabila ia berubah dan apabila ia dimusnahkan! Kemudian butang mengawal main balik Dan hanya jeda~


Contoh 3: Gunakan VideoView untuk memainkan video

Selain menggunakan MediaPlayer + SurfaceView untuk memainkan video, kami juga boleh menggunakan VideoView untuk terus Untuk memainkan video, kita boleh mencapai main balik video dengan menukar sedikit! Kesan pengendalian adalah konsisten dengan perkara di atas, jadi saya tidak akan menyiarkannya. Pergi terus ke kod!

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private VideoView videoView;
    private Button btn_start;
    private Button btn_pause;
    private Button btn_stop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
    }
    
    private void bindViews() {
        videoView = (VideoView) findViewById(R.id.videoView);
        btn_start = (Button) findViewById(R.id.btn_start);
        btn_pause = (Button) findViewById(R.id.btn_pause);
        btn_stop = (Button) findViewById(R.id.btn_stop);

        btn_start.setOnClickListener(this);
        btn_pause.setOnClickListener(this);
        btn_stop.setOnClickListener(this);
        
        //根据文件路径播放
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/lesson.mp4");
        }

        //读取放在raw目录下的文件
        //videoView.setVideoURI(Uri.parse("android.resource://com.jay.videoviewdemo/" + R.raw.lesson));
        videoView.setMediaController(new MediaController(this));
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start:
                videoView.start();
                break;
            case R.id.btn_pause:
                videoView.pause();
                break;
            case R.id.btn_stop:
                videoView.stopPlayback();
                break;
        }
    }
}

Kod ini sangat mudah dan saya tidak akan menerangkannya~ Jika anda mempunyai sebarang soalan, jalankan sahaja dalam Demo seterusnya~


3. Muat turun contoh kod dalam bahagian ini:

MediaPlayerDemo.zip

MediaPlayerDemo2.zip

VideoViewDemo.zip


Ringkasan bahagian ini:

Baiklah, bahagian ini memperkenalkan secara ringkas cara menggunakan MediaPlayer untuk memainkan audio dan gabungkannya dengan SurfaceView untuk memainkan video Akhirnya, saya menulis contoh menggunakan VideoView untuk memainkan video. Semuanya adalah penggunaan yang sangat mudah Saya percaya sangat mudah untuk semua orang belajar~ Baiklah, terima kasih~