MediaPlayer는 오디오 및 비디오를 재생합니다.


이 섹션 소개:

이 섹션에서는 Android 멀티미디어의 MediaPlayer를 소개합니다. 이 API를 통해 오디오 및 비디오를 재생할 수 있습니다. 이 클래스는 Android 멀티미디어 프레임워크의 중요한 구성 요소입니다. 이 클래스를 통해 가장 작은 단계로 획득하고 디코딩할 수 있습니다. 오디오와 비디오를 재생합니다. 세 가지 미디어 소스를 지원합니다:

  • 로컬 리소스
  • 내부 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에는 다음 형식도 있습니다. create(Context context, Uri uri, SurfaceHolder 홀더) Uri를 통해 멀티미디어 플레이어를 만들고 SurfaceHolder [Abstract 클래스]를 지정합니다.


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 폴더와 동일한 수준의 자산 폴더에 넣은 후 다음 코드를 사용하여 데이터 소스를 설정해야 합니다.

AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());

3) 다른 방법

  • getCurrentPosition( ): 현재 재생 위치를 가져옵니다
  • getDuration(): 파일의 시간을 가져옵니다
  • getVideoHeight(): 동영상 높이를 가져옵니다
  • getVideoWidth (): 비디오 너비 가져오기
  • isLooping(): 반복 여부
  • isPlaying(): 재생 여부
  • pause(): 일시 중지
  • 준비 ( ): 준비(동기화)
  • prepareAsync(): 준비(비동기)
  • release(): MediaPlayer 개체 해제
  • reset(): MediaPlayer 개체 재설정
  • seekTo(int msec) : 재생 위치 지정(시간(밀리초))
  • setAudioStreamType(int streamtype): 스트리밍 미디어 유형 지정
  • setDisplay(SurfaceHolder sh): SurfaceHolder를 사용하여 멀티미디어를 표시하도록 설정
  • setLooping(boolean looping): 루프 재생
  • setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener 리스너) 여부를 설정합니다. 네트워크 스트리밍 미디어
  • setOnCompletionListener(MediaPlayer.OnCompletionListener 리스너)에 대한 버퍼 수신 대기: 네트워크 스트리밍 미디어 재생 종료 모니터링
  • setOnErrorListener(MediaPlayer.OnErrorListener 리스너): 오류 메시지 리스너 설정
  • setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener 리스너): 비디오 모니터링 eSetScreenonWhileplaying (Boolean Screenon)
  • : SurfaceHolder를 사용하여
  • SetVolume (Float Leftvolume, Float Rightvolume)
  • : 볼륨 설정
  • Start
  • (): 재생 재생 시작 )Stop
  • () : 재생 중지
  • 2. 코드 예제 사용
예 1
: MediaPlayer를 사용하여 오디오 재생:

렌더링 실행

:

키 코드

:

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;
        }
    }
}
1.png참고:

Res/raw 디렉터리에 있는 오디오 파일은 MediaPlayer를 처음 생성할 때 호출됩니다. prepare()를 다시 호출할 필요가 없습니다. 생성자 메서드를 사용하여 생성한 경우 prepare() 메서드를 한 번 호출하면 됩니다! 또한 공식 문서에 다른 두 채널의 오디오를 재생하기 위한 샘플 코드를 게시하세요.

Local Uri
:

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

External URL

:

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();

Note: 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.java2.png:

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();
    }
}

코드는 매우 간단합니다. 레이아웃에는 SurfaceView가 있고 getHolder를 호출하여 SurfaceHolder 객체를 얻습니다. 여기에서 SurfaceView 관련 설정을 완료하고 디스플레이 해상도와 콜백 인터페이스를 설정하세요. SurfaceView가 생성될 때, 변경될 때, 소멸될 때의 세 가지 메서드를 재정의합니다! 그런 다음 버튼으로 재생을 제어합니다. 그리고 잠시 멈추세요~

예 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

이 섹션 요약:

이 섹션에서는 MediaPlayer를 사용하여 오디오를 재생하는 방법을 간략하게 소개합니다. SurfaceView와 결합 마지막으로 VideoView를 사용하여 동영상을 재생하는 예제를 작성했습니다. 모두 매우 간단한 사용법입니다~ 누구나 쉽게 배울 수 있을 거라 믿습니다~ 감사합니다~