このセクションの概要:
このセクションでは、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(); 壊す; } } }