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 には次の形式もあります:
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) その他のメソッド
: MediaPlayer を使用してオーディオを再生します:例 1
- 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. コード例を使用します
レンダリングを実行します
:
キーコード
: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; } } }注:
初めて再生を開始する前に、res/raw ディレクトリ内のオーディオ ファイルが再生されます。 コンストラクター メソッドを使用して構築されている場合は、prepare() メソッドを 1 回呼び出す必要はありません。 さらに、他の 2 つのチャネルからオーディオを再生するためのサンプル コードを公式ドキュメントに投稿します。
ローカル Uri:外部 URLUri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
: 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.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(); } }
このコードは非常に単純で、次に 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 を使ってビデオを再生する例を書きました。どれも非常に簡単な使い方です。 誰にとってもとても簡単に学べると思います~はい、ありがとう~