1. ホーム
  2. Android

Android マルチメディア MediaPlayerの使用方法詳細

2022-02-17 06:46:20

 今でこそ、携帯電話はどんどんリッチになっていますが、10年前はMP3、MP4、MP5、が大人気で、ブログ主も高校生になり、音楽を聴いたり、映画を見たりするために一台欲しいなと思っていました。しかし、条件が限られている、学校もこの事を禁止しているので、密かに遊ぶだけ。Andriodシステムに搭載されているMediaplayerとVideoViewを使って簡単な音楽・動画再生を実現し、Kugou Musicのようなアプリも作りたい、やろうと思えば難しくないはずです。Kugou Musicのようなアプリを作るのは、やろうと思えば難しいことではないはずで、これをベースに機能の拡張を実現しています。

 AndroidのMediaPlayerには、AudioとVideoの再生機能があり、MusicアプリもVideoアプリもAndroidのインターフェースでMediaPlaerを呼び出して行っています。

<スパン I. オーディオファイルの再生

         MediaPlaerのライフサイクルを初めて見る


以下は、MediaPlayerが提供する一般的なメソッドです。

<テーブル メソッド 説明 メディアプレーヤー コンストラクトメソッド 作成 再生するマルチメディアを作成する getCurrentPosition 現在の再生位置を取得する 取得期間 ファイルのデュレーションを取得する ゲットビデオハイト 動画の高さを取得する ビデオ幅 動画の幅を取得する isLooping ループさせるかどうか isPlaying IsPlaying ポーズ ポーズ 用意する プリペア(シンクロナイズ) prepareAsync 準備(非同期) リリース MediaPlayer オブジェクトに関連付けられたリソースを解放する。 リセット MediaPlayerオブジェクトを生成されたばかりの状態にリセットする シークトゥ 再生する場所を指定する(ミリ秒単位の時間指定) setAudioStreamType ストリーミングメディアの種類を設定する setDataSource マルチメディアのデータソース(場所)を設定する setDisplay マルチメディアを表示するためのSurfaceHolderを設定する setLooping ループさせるかどうかを設定する setOnButteringUpdateListener ネットワークストリーミングのバッファリングリスナー setOnErrorListener エラーメッセージのリスナーを設定する setOnVideoSizeChangedListener 動画サイズリスナー setScreenOnWhilePlaying SurfaceHolderを使用して画面を表示したままにするかどうかを設定する セットボリューム ボリュームを設定する 開始 再生開始 停止 再生の停止
MediaPlayerのワークフローは次のようになります。

1、まずMediaPlaerオブジェクトを作成します。

2、次にsetDataSource()メソッドを呼び出し、音声ファイルのパスを設定します。 **

3、次にprepare()メソッドを呼び出し、MediaPlayerを準備完了状態にする。

4、startメソッドを呼び出して音声を再生します。

  *  MediaPlaerオブジェクトを作成するには、次の2つの方法があります。 

   a 直接的に新規作成する

MediaPlayer mp = new MediaPlayer();

b createメソッドを使用する

MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//this time there is no need to call setDataSource


もちろん、上記でまず必要なのは、resフォルダ内にrawフォルダを新規作成し、テストファイルを配置することです

**  再生するファイルを設定する

      MediaPlayerで再生されるファイルには、主に3つのソースがあります。
a. あらかじめアプリ内のユーザー自身のリソース
例えば MediaPlayer.create(this, R.raw.test);
b. SDカードやその他のファイルパスに保存されているメディアファイル
例: mp.setDataSource("/sdcard/test.mp3");
c. ネットワーク上のメディアファイル
例:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3")。
MediaPlayerのsetDataSourceには4つのメソッドがあります。
setDataSource (文字列パス)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, 長いオフセット, 長い長さ)

FileDescriptorを使用する場所では、resフォルダと同じ階層のassetsフォルダにファイルを置いてから使用する必要があります。
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength()));
データソースを設定する
まずは簡単に結果を見てみましょう。


   上記の機能を一目でわかるようにするためには、言わずもがな

以下は実装コードです。

アクティビティ_メイン.xml

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/play"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="play" />

        <Button
            android:id="@+id/pause"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="pause" />

        <Button
            android:id="@+id/stop"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="stop" />
    </LinearLayout>

    <SeekBar
        android:id="@+id/seekbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="0"
        android:progress="0"
        android:secondaryProgress="0" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id

MainActivity.java

package com.example.musicplayer;

import java.io.File;
import java.io.IOException;

import android.R.integer;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget;
import android.widget.SeekBar;
OnSeekBarChangeListener; import android.widget.SeekBar;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener,
		OnSeekBarChangeListener {
	private Button play, pause, stop;
	private MediaPlayer player;
	private SeekBar mSeekBar;
	private TextView tv, tv2;
	private boolean hadDestroy = false;
	private Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {

			switch (msg.what) {
			case 0x01:

				break;

			default:
				break;
			}
		};
	};
	Runnable runnable = new Runnable() {

		@Override
		public void run() {

			if (!hadDestroy) {
				mHandler.postDelayed(this, 1000);
				int currentTime = Math
						.round(player.getCurrentPosition() / 1000);
				String currentStr = String.format("%s%02d:%02d", "currentTime ",
						currentTime / 60, currentTime % 60);
				tv.setText(currentStr);
				mSeekBar.setProgress(player.getCurrentPosition());
			}
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		play = (Button) findViewById(R.id.play);
		pause = (Button) findViewById(R.id.pause);
		stop = (Button) findViewById(R.id.stop);
		mSeekBar = (SeekBar) findViewById(R.id.seekbar). mSeekBar = (SeekBar) findViewById(R.id.seekbar);
		tv = (TextView) findViewById(R.id.tv);
		tv2 = (TextView) findViewById(R.id.tv2). tv2 = (TextView) findViewById(R.id.tv2);
		mSeekBar.setOnSeekBarChangeListener(this);
		play.setOnClickListener(this);
		pause.setOnClickListener(this);
		stop.setOnClickListener(this);
		player = new MediaPlayer();
		initMediaplayer();

	}

	/**
	 * Initialize the player
	 */
	private void initMediaplayer() {
		try {
			File file = new File(Environment.getExternalStorageDirectory()
					+ "/Download/", "aiqiu.mp3");
			player.setDataSource(file.getPath());
			Log.e("player", file.toString());
			player.prepare();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.play:
			if (!player.isPlaying()) {
				player.start();
				int totalTime = Math.round(player.getDuration() / 1000);
				String str = String.format("%02d:%02d", totalTime / 60,
						totalTime % 60);
				tv2.setText(str);
				mSeekBar.setMax(player.getDuration());
				mHandler.postDelayed(runnable, 1000);
			}

			break;
		case R.id.pause:
			if (player.isPlaying()) {
				player.pause();
			}
			break;
		case R.id.stop:
			if (player.isPlaying()) {
				player.reset();
				initMediaplayer();
			}
			break;

		default:
			break;
		}
	}

	@Override
	public void onProgressChanged(SeekBar seekBar, int progress,
			boolean fromUser) {
		if (player ! = null) {
			player.seekTo(seekBar.getProgress());
		}

	}

	@Override
	public void onStartTrackingTouch(SeekBar seekBar) {
		// TODO auto-generated method stubs

	}

	@Override
	public void onStopTrackingTouch(SeekBar seekBar) {
		// TODO auto-generated method stubs
	}

	@Override
	protected void onDestroy() {
		// TODO auto-generated method stub
		super.onDestroy();
		if (player ! = null) {
			player.stop();
			hadDestroy = true;
			player.release();
		}
	}

}


II. 動画ファイルを再生する
     動画ファイルの再生は、音声ファイルの再生ほど複雑ではありませんが、ここではVideoViewクラスを使って実装しています。このクラスは、動画の表示と制御を一元的に行います。

     VideoViewもMediaPlaerと同様で、以下の共通メソッドがあります。

<テーブル

メソッド名

機能説明

setVideoPath()

再生するビデオファイルの場所を設定します。

開始()

動画を開始または継続します。

pause()

ビデオの再生を一時停止する。

レジューム()

動画を再スタートさせます。

seekTo()

指定された位置から動画の再生を開始する。

isPlaying()

動画が現在再生中かどうかを判定します。

getDuration()

読み込んだビデオファイルのデュレーションを取得します。


VideoViewはMediaPlayerをラップしたものなので、使い方は似ています。

例えば

private void initVideoPlayer() {
		File file = new File(Environment.getExternalStorageDirectory()
				+ "/Download/", "Sample.3gp");
		videoPlayer.setVideoPath(file.getPath());// Specify the path to the video file

	}


イベント処理

@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.play:
			if (!videoPlayer.isPlaying()) {
				videoPlayer.start();
			}
			break;
		case R.id.pause:
			if (videoPlayer.isPlaying()) {
				videoPlayer.pause();
			}
			break;
		case R.id.stop:
			if (videoPlayer.isPlaying()) {
				videoPlayer.resume();
			}
			break;

		default:
			break;
		}
	}



III. MediaPlayerの一般的なエラー

        つまり、そのエラーの状態です。例えば、このようなエラー開始は、彼のエラー状態を示す0と、状態0で呼ばれ、以下は、ソースコードで見つかったMediaPlayerの状態である。

 enum media_player_states {
        MEDIA_PLAYER_STATE_ERROR = 0, // 0 state
        MEDIA_PLAYER_IDLE = 1 << 0, // 1 state
        MEDIA_PLAYER_INITIALIZED = 1 << 1, // 2 state
        MEDIA_PLAYER_PREPARING = 1 << 2, // 4 state
        MEDIA_PLAYER_PREPARED = 1 << 3, // 8 state
        MEDIA_PLAYER_STARTED = 1 << 4, // 16 states
        MEDIA_PLAYER_PAUSED = 1 << 5, // 32 states
        MEDIA_PLAYER_STOPPED = 1 << 6, // 64 state
        MEDIA_PLAYER_PLAYBACK_COMPLETE = 1 << 7, // 128 state
    }

    報告されたエラーの状態とMediaPlayerのライフサイクル(上記)を参照することで、エラーを分析することができます。




<スパン 上記の内容で疑問や間違いがあれば、ぜひコメントを残してくださいね。