MediaPlayer はオーディオとビデオを再生します


このセクションの概要:

このセクションでは、Android マルチメディアの MediaPlayer について説明します。この API を通じてオーディオとビデオを再生できます。 このクラスは、Androd マルチメディア フレームワークの重要なコンポーネントです。このクラスを通じて、最小のステップで取得およびデコードできます。 オーディオとビデオを再生します。 3 つの異なるメディア ソースをサポートしています:

  • ローカル リソース
  • 内部 URI。たとえば、ContentResolver を通じて
  • 外部 URL (ストリーム) を取得できます。 Android でサポートされているメディア形式のリストについては

Android でサポートされているメディア形式のリストについては、次を参照してください: サポートされているメディア形式 ドキュメント

このセクションでは、MediaPlayer を使用してオーディオとビデオを再生する簡単な例を作成します。 !

公式 API ドキュメント: MediaPlayer


1. 関連メソッドの詳細な説明


1) MediaPlayer インスタンスを取得します:

直接 new

するか、create メソッドを呼び出して作成できます:

MediaPlayer mp = new MediaPlayer();
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);  //无需再调用setDataSource
さらに、create には次の形式もあります:

create(Context context, Uri uri, SurfaceHolderholder)

Uri を通じてマルチメディア プレーヤーを作成し、SurfaceHolder [抽象クラス] を指定します

2) 再生ファイルを設定します:
//①raw下的资源:
MediaPlayer.create(this, R.raw.test);

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

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

さらに、多くの setDataSource() メソッドがあり、これを使用する場合は、このタイプのパラメータ FileDescriptor があります。 API を使用する場合は、res フォルダーと同じレベルのアセット フォルダーにファイルを配置し、次のコードを使用して DataSource を設定する必要があります。
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());

3) その他のメソッド

  • getCurrentPosition(): 現在の再生位置を取得します
  • getDuration(): ファイルの時間を取得します
  • getVideoHeight() : 動画の高さを取得します
  • getVideoWidth (): 動画の幅を取得
  • isLooping(): ループするかどうか
  • isPlaying(): 再生するかどうか
  • pause(): 一時停止
  • 準備( ): 準備 (同期)
  • prepareAsync(): 準備 (非同期)
  • release(): MediaPlayer オブジェクトを解放
  • reset(): MediaPlayer オブジェクトをリセット
  • seekTo(int秒) : 再生位置を指定します (ミリ秒単位の時間)
  • setAudioStreamType(int streamtype): ストリーミングメディアのタイプを指定します
  • setDisplay(SurfaceHolder sh): マルチメディアの表示に SurfaceHolder を使用するように設定します
  • setLooping(boolean) looping): ループ再生するかどうかを設定します
  • setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener): ネットワーク ストリーミング メディアをリッスンするバッファー
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listener): ネットワークストリーミングメディア再生終了監視
  • setOnErrorListener(MediaPlayer.OnErrorListener listenr): エラー メッセージ リスナーを設定します
  • setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener): ビデオモニタリング eSetScreenonwhileplaying (Boolean Screenon)
  • : SurfaceHolder を使用して表示するかどうかを設定します
  • SetVolume (Float Leftvolume、Float Rightvolume)
  • : 音量を設定します
  • Start
  • (): Play Play を開始します )Stop
  • () :再生を停止します
  • 2. コード例を使用します
例 1
: MediaPlayer を使用してオーディオを再生します:

レンダリングを実行します

:

キーコード

:

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;
        }
    }
}
1.png注:

初めて再生を開始する前に、res/raw ディレクトリ内のオーディオ ファイルが再生されます。 コンストラクター メソッドを使用して構築されている場合は、prepare() メソッドを 1 回呼び出す必要はありません。 さらに、他の 2 つのチャネルからオーディオを再生するためのサンプル コードを公式ドキュメントに投稿します。

ローカル Uri
:

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

外部 URL

:

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();

: URL を介してストリーミングする場合オンライン オーディオ ファイルを再生するには、ファイルが次のことを行うことができる必要があります。 プログレッシブダウンロード


例 2: MediaPlayer を使用してビデオを再生します

MediaPlayer は主にオーディオの再生に使用され、画像出力インターフェイスを提供しないため、他のものを使用する必要があります MediaPlayer によって再生された画像出力を表示するコンポーネント。SurfaceView を使用してそれを表示できます。以下では、SurfaceView を使用してビデオ再生の例を記述します。

レイアウト ファイル:

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.java2.png:

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();
    }
}

このコードは非常に単純で、次に getHolder を呼び出して SurfaceHolder オブジェクトを取得します。 ここで SurfaceView 関連の設定を完了し、ディスプレイ解像度とコールバック インターフェイスを設定します。 SurfaceView の作成時、変更時、破棄時に、SurfaceView の 3 つのメソッドをオーバーライドします。次にボタンで再生を制御します そして一時停止してください~

例 3: VideoView を使用してビデオを再生します

MediaPlayer + SurfaceView を使用してビデオを再生することに加えて、VideoView を使用して直接ビデオを再生することもできます。 動画を再生するには、少し変更するだけで動画再生が実現できます!作用効果は上記と一致するため、掲載しません。 コードに直接アクセスしてください。

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;
        }
    }
}

コードは非常に簡単なので説明しません~ご質問がある場合は、次のデモを実行してください~


3. このセクションのサンプル コードをダウンロードします。

mediaplayerdemo.zip

mediaplayerdemo2.zip

videoviewdemo.zip


summaryこのセクション:

okay、このセクションでは、メディアプレーヤーを使用してオーディオを再生し、それをSurfaceViewと組み合わせる方法を簡単に紹介します。 最後に、VideoView を使ってビデオを再生する例を書きました。どれも非常に簡単な使い方です。 誰にとってもとても簡単に学べると思います~はい、ありがとう~