Androidでのオーディオファイルの再生

前回はオーディオファイルの録音方法についてお話しました。今回はオーディオファイルの再生方法についてお話します。音声を録音します。通常、チャットで音声を送信したり、音声をアップロードしたりするときに使用します。録音が必要なため、再生機能が必要です。同時に、オーディオを再生し、音楽も再生する必要があります。そこで本日は、オーディオ再生機能についてお話します。

1.メディアプレーヤーの紹介MediaPlayer

オーディオを再生しているので、MediaPlayerが使用されます。MediaPlayerは、Androidに付属のオーディオおよびビデオプレーヤーです。これを使用して、MediaRecorderによって記録されたamr、aac、mp4、3gpなどのメディアファイルや、mp3、wav、mid、ogg、mkvなどのオーディオファイルを再生できます。 、mov、aviなど。ビデオファイル。

2. MediaPlayerの一般的な方法(ブロードキャストとプロジェクションに共通)

  • リセット:プレーヤーをリセットします。
  • 準備:プレイする準備ができました。
  • 開始:再生を開始します
  • 一時停止:再生を一時停止します。
  • stop:再生を停止します。
  • setOnPreparedListener:再生するリスナーを設定します。インターフェイスMediaPlayer.OnPreparedListenerのonPreparedメソッドを実装する必要があります。
  • setOnCompletionListener:再生終了リスナーを設定します。インターフェイスMediaPlayer.OnCompletionListenerのonCompletionメソッドを実装する必要があります。
  • setOnSeekCompleteListener:再生ドラッグリスナーを設定します。インターフェイスMediaPlayer.OnSeekCompleteListenerのonSeekCompleteメソッドを実装する必要があります。
  • create:指定したUriでプレイヤーを作成します。
  • setDataSource:再生データソースのファイルパスを設定します。createとsetDataSourceの2つのメソッドのうち1つだけを呼び出す必要があります。
  • setVolume:音量を設定します。2つのパラメータは、左チャネルと右チャネルの音量で、値は0〜1です。
  • setAudioStreamType:オーディオストリームのタイプを設定します。オーディオストリームタイプの値の説明については、表1を参照してください。
表1

AudioManagerクラスのリングタイプ

着メロ名 説明
STREAM_VOICE_CALL コールトーン  
STREAM_SYSTEM システムトーン  
STREAM_RING 着信音 着信やテキストメッセージの着信音
STREAM_MUSIC メディアサウンド オーディオ、ビデオ、ゲームなどのサウンド
STREAM_ALARM アラーム音  
STREAM_NOTIFICATION 通知音  
  • setLooping:再生をループするかどうかを設定します。trueはループで再生することを意味し、falseは1回だけ再生することを意味します。
  • isPlaying:再生しているかどうかを確認します。
  • seekTo:再生の進行状況を指定した位置にドラッグします。このメソッドは、SeekBarドラッグバーと組み合わせて使用​​できます。
  • getCurrentPosition:現在の再生進行状況の位置を取得します。
  • getDuration:再生時間をミリ秒単位で取得します。

3.サンプルコード

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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

        <ProgressBar
            android:id="@+id/pro_bar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/bt_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开始" />

        <Button
            android:id="@+id/bt_pause"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="暂停" />
    </LinearLayout>
</RelativeLayout>

MainActivity.java

public class MainActivity extends WaterPermissionActivity implements View.OnClickListener, MediaPlayer.OnCompletionListener {

    private String voicePath;
    private ProgressBar pro_bar;
    private Button bt_start;
    private Button bt_pause;
    private MediaPlayer mMediaPlayer;
    private Handler mHandler;
    private boolean isComplete = true;//是否完成

    @Override
    protected MvcBaseModel getModelImp() {
        return null;
    }

    @Override
    protected int getContentLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    protected void initWidget() {
        pro_bar = findViewById(R.id.pro_bar);
        bt_start = findViewById(R.id.bt_start);
        bt_pause = findViewById(R.id.bt_pause);
        bt_start.setOnClickListener(this);
        bt_pause.setOnClickListener(this);
        requestPermission(WRITE_EXTERNAL_STORAGE);
    }

    @Override
    protected void doSDWrite() {
        requestPermission(READ_EXTERNAL_STORAGE);
    }

    @Override
    protected void doSDRead() {
        //初始化音源路径
        getPath();
        //初始化媒体播放器
        init();
    }

    /**
     * 录制前创建一个空文件并获取路径
     */
    private void getPath() {
        List<String> list = new ArrayList<>();
        list.add("record");
        String dirPath = PathGetUtil.getLongwayPath(this, list);
        File fileVoice = new File(dirPath, "voice1616667408548.amr");
        voicePath = fileVoice.getPath();
    }

    /**
     * 初始化MediaPlayer
     */
    private void init() {
        mHandler = new Handler();
        mMediaPlayer = new MediaPlayer();//创建一个媒体播放器
        mMediaPlayer.setOnCompletionListener(this);//设置媒体播放器的播放完成监听器
        //定时器
        mHandler.postDelayed(r, 100);//延时100毫秒
    }

    /**
     * 播放音频
     */
    private void play() {
        try {
            isComplete = false;
            //重置媒体播放器
            mMediaPlayer.reset();
            //设置音频类型为音乐
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            //设置媒体数据的文件路径
            mMediaPlayer.setDataSource(voicePath);
            //媒体播放器准备就绪
            mMediaPlayer.prepare();
            //媒体播放器开始播放
            mMediaPlayer.start();
            //设置进度条
            pro_bar.setMax(mMediaPlayer.getDuration());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_start:
                if (pro_bar.getProgress()!=0) {
                    //暂停开始
                    mMediaPlayer.start();
                } else {
                    //普通开始
                    play();
                }
                break;
            case R.id.bt_pause:
                if (mMediaPlayer.isPlaying()) {
                    mMediaPlayer.pause();
                }
                break;
        }
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        isComplete = true;
        ToastUtil.toastWord(this, "播放完成");
    }

    private Runnable r = new Runnable() {
        @Override
        public void run() {
            if (mHandler != null) {
                if (isComplete) {
                    pro_bar.setProgress(0);
                } else {
                    pro_bar.setProgress(mMediaPlayer.getCurrentPosition());
                }
                mHandler.postDelayed(this, 500);
            }
        }
    };
}

 

おすすめ

転載: blog.csdn.net/weixin_38322371/article/details/115234871