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

このセクションの概要:

このセクションでは、Android マルチメディアの MediaPlayer について説明します。この API を使用して、オーディオとビデオを再生できます。このクラスは、Android マルチメディア フレームワークの重要なコンポーネントです。このクラスを通じて、最小限の手順でそれを取得してデコードでき、オーディオを再生できます。そしてビデオ。次の 3 つの異なるメディア ソースをサポートしています。

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

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

さらに、FileDescriptor というタイプのパラメーターを持つ複数の setDataSource() メソッドがあります。この API を使用するときは、ファイルを res フォルダーと同じレベルの Assets フォルダーに配置し、次のメソッドを使用する必要があります。 DataSource を設定するコード:

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

3) その他の方法

  • getCurrentPosition (): 現在の再生位置を取得します。
  • getDuration (): ファイルの時間を取得します。
  • getVideoHeight (): ビデオの高さを取得します
  • getVideoWidth (): ビデオの幅を取得
  • isLooping (): ループするかどうか
  • isPlaying (): 再生中かどうか
  • 一時停止(): 一時停止
  • prepare (): 準備 (同期)
  • prepareAsync (): 準備(非同期)
  • release() : MediaPlayer オブジェクトを解放します。
  • reset ():MediaPlayerオブジェクトをリセットします。
  • SeekTo(int msec) : 再生する位置を指定します (ミリ秒単位の時間)
  • setAudioStreamType(int streamtype) : ストリーミング メディアのタイプを指定します
  • setDisplay(SurfaceHolder sh) : マルチメディアを表示するように SurfaceHolder を設定します
  • setLooping(boolean looping) : ループするかどうかを設定します
  • setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listenr) : ネットワーク ストリーミング メディアのバッファリング監視
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listenr) : ネットワーク ストリーミング メディア再生の最後までリッスンします
  • setOnErrorListener(MediaPlayer.OnErrorListener リスナー) : エラー メッセージ リスナーを設定します
  • setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener リスナー) : ビデオ サイズの監視
  • setScreenOnwhilePlaying(boolean screenOn) : SurfaceHolder ディスプレイを使用するかどうかを設定します
  • setVolume(float leftVolume, float rightVolume) : 音量を設定します
  • start (): 再生を開始します
  • stop (): 再生を停止します

2. コード例を使用する

例 1 : MediaPlayer を使用してオーディオを再生します。

ランニング効果図

キーコード:

public class MainActivity extends AppCompatActivityimplemented View.OnClickListener{ 

    private Button btn_play; 
    プライベートボタン btn_pause; 
    プライベートボタン btn_stop; 
    プライベート MediaPlayer mPlayer = null; 
    プライベートブール値 isRelease = true; // MediaPlayer が放たれたかどうか判断

    @Override 
    protected void onCreate(Bundle SavedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        バインドビュー(); 
    } 

    private void bindingViews() { 
        btn_play = (ボタン) findViewById(R.id.btn_play); 
        btn_pause = (ボタン) findViewById(R.id.btn_pause);
        btn_stop = (ボタン) 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);
                壊す; 
            ケース 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; 
        } 
    } 
}

予防:

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

ローカル URI :

ウリ myUri = ....; // ここで Uri を初期化します
MediaPlayer mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mediaPlayer.setDataSource(getApplicationContext(), myUri); 
mediaPlayer.prepare(); 
mediaPlayer.start();

外部URL

文字列 URL = "http://....."; // URL はここにあります
MediaPlayer mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mediaPlayer.setDataSource(url); 
mediaPlayer.prepare(); // 時間がかかるかもしれません! (バッファリングなどのため) 
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" /> 

    <ボタン
        android:id="@+id/btn_start" 
        android:layout_width="wrap_content " 
        android:layout_height="wrap_content"
        アンドロイド:text="开始" /> 

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

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

MainActivity.java

public class MainActivity extends AppCompatActivityimplemented View.OnClickListener, SurfaceHolder.Callback { 

    private MediaPlayer mPlayer = null; 
    プライベート SurfaceView sfv_show; 
    プライベート SurfaceHolder surfaceHolder; 
    プライベートボタン btn_start; 
    プライベートボタン btn_pause; 
    プライベートボタン btn_stop; 

    @Override 
    protected void onCreate(Bundle SavedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        バインドビュー(); 
    private void 

    bindingViews() {  
        sfv_show = (SurfaceView) findViewById(R.id.sfv_show);
        btn_start = (ボタン) findViewById(R.id.btn_start); 
        btn_pause = (ボタン) 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(); 
                mPlayer.pause();
                ブレーク;
                ブレーク;
            case R.id.btn_pause: 
    @Override
            case R.id.btn_stop: 
                mPlayer.stop(); 
                壊す; 
        @Override 
    public void surfaceCreated(SurfaceHolderholder) { 
        mPlayer = MediaPlayer.create(MainActivity.this, R.raw.lesson 
    ) 

    ; 
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
        mPlayer.setDisplay(surfaceHolder); //SurfaceView 上にビデオ表示を設置
    } 
    @Override 
    public void surfaceChanged(SurfaceHolderholder, int format, int width, int height) {} 
    @Override 
    public void surfaceDestroyed(SurfaceHolderholder) {} 
    protected void onDestroy() { 
        super.onDestroy ();



        if (mPlayer.isPlaying()) { 
            mPlayer.stop(); 
        mPlayer.release 
        (); 
    } 
}

コードは非常にシンプルです。レイアウトに SurfaceView があり、getHolder を呼び出して SurfaceHolder オブジェクトを取得します。ここで SurfaceView 関連の設定を完了し、ディスプレイ解像度とコールバック インターフェイスを設定し、作成時に SurfaceView を書き換えます。変化するときと破壊されるときの3つの方法!次に、ボタンで再生と一時停止を制御します~


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

MediaPlayer + SurfaceView を使用してビデオを再生するだけでなく、VideoView を使用してビデオを直接再生することもでき、少しの変更でビデオ再生を実現できます。実行中のエフェクトは上記と一致しているため、貼り付けずに、コードを直接投稿してください。

MainActivity.java

public class MainActivity extends AppCompatActivityimplemented View.OnClickListener { 

    private VideoView videoView; 
    プライベートボタン btn_start; 
    プライベートボタン btn_pause; 
    プライベートボタン btn_stop; 

    @Override 
    protected void onCreate(Bundle SavedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        バインドビュー(); 
    } 
    
    private void bindingViews() { 
        videoView = (VideoView) findViewById(R.id.videoView); 
        btn_start = (ボタン) findViewById(R.id.btn_start); 
        btn_pause = (ボタン) findViewById(R.id.btn_pause);
        btn_stop = (ボタン) 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.get externalStorageDirectory() + "/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(); 
                壊す; 
            case R.id.btn_stop: 
                videoView.stopPlayback(); 
                壊す; 
        } 
} 
    }

おすすめ

転載: blog.csdn.net/leyang0910/article/details/131905964