Android에서 오디오 파일 재생

지난번에 오디오 파일을 녹음하는 방법에 대해 이야기했습니다. 이번에는 오디오 파일 재생 방법에 대해 이야기하겠습니다. 오디오를 녹음합니다. 일반적으로 채팅에서 음성을 보내거나 음성을 업로드 할 때 사용합니다. 녹음이 필요하므로 재생 기능이 있어야합니다. 동시에 우리는 오디오를 재생하고 음악도 재생해야합니다. 그래서 오늘은 오디오 재생 기능에 대해 이야기하겠습니다.

1. 미디어 플레이어 MediaPlayer 소개

오디오를 재생하기 때문에 MediaPlayer가 사용됩니다. MediaPlayer는 Android와 함께 제공되는 오디오 및 비디오 플레이어입니다. MediaRecorder에서 녹음 한 amr, aac, mp4, 3gp는 물론 mp3, wav, mid, ogg, mkv와 같은 오디오 파일을 재생하는 데 사용할 수 있습니다. , mov, avi 등 비디오 파일.

2. MediaPlayer의 일반적인 방법 (방송 및 프로젝션에 공통)

  • 재설정 : 플레이어를 재설정합니다.
  • 준비 : 플레이 준비.
  • 시작 : 재생 시작
  • 일시 중지 : 재생을 일시 중지합니다.
  • 중지 : 재생을 중지합니다.
  • setOnPreparedListener : 재생할 리스너를 설정합니다. MediaPlayer.OnPreparedListener 인터페이스의 onPrepared 메서드를 구현해야합니다.
  • setOnCompletionListener : 재생 종료 리스너를 설정합니다. MediaPlayer.OnCompletionListener 인터페이스의 onCompletion 메서드를 구현해야합니다.
  • setOnSeekCompleteListener : 재생 드래그 리스너를 설정합니다. MediaPlayer.OnSeekCompleteListener 인터페이스의 onSeekComplete 메서드를 구현해야합니다.
  • create : 지정된 Uri를 사용하여 플레이어를 만듭니다.
  • setDataSource : 재생 데이터 소스의 파일 경로를 설정합니다. create 및 setDataSource의 두 메서드 중 하나만 호출하면됩니다.
  • setVolume : 볼륨을 설정합니다. 두 매개 변수는 왼쪽 채널과 오른쪽 채널의 볼륨이며 값은 0과 1 사이입니다.
  • setAudioStreamType : 오디오 스트림 유형을 설정합니다. 오디오 스트림 유형의 값 설명은 표 1을 참조하십시오.
1 번 테이블

AudioManager 클래스의 링 유형

벨소리 이름 기술
STREAM_VOICE_CALL 호출음  
STREAM_SYSTEM 시스템 톤  
STREAM_RING 벨소리 수신 전화 및 문자 메시지의 벨소리
STREAM_MUSIC 미디어 사운드 오디오, 비디오, 게임 등 사운드
STREAM_ALARM 경보 음  
STREAM_NOTIFICATION 알림 음  
  • setLooping : 반복 재생 여부를 설정합니다. true는 루프에서 재생하는 것을 의미하고 false는 한 번만 재생하는 것을 의미합니다.
  • 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