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

이 섹션 소개:

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

  • 지역 자원
  • 예를 들어 내부 URI는 ContentResolver를 통해 가져올 수 있습니다.
  • Android용으로 지원되는 미디어 형식의 외부 URL(스트림) 목록

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 holder)는  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 폴더와 동일한 수준의 assets 폴더에 파일을 넣은 후 다음을 사용하십시오. DataSource를 설정하는 코드:

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

3) 기타 방법

  • getCurrentPosition ( ): 현재 재생 위치 가져오기
  • getDuration (): 파일의 시간 가져오기
  • getVideoHeight (): 비디오 높이 가져오기
  • getVideoWidth (): 비디오 너비 가져오기
  • isLooping (): 반복 여부
  • isPlaying (): 재생 여부
  • 일시 중지 (): 일시 중지
  • 준비 (): 준비(동기식)
  • prepareAsync (): 준비(비동기)
  • release() : MediaPlayer 개체 해제
  • 재설정 (): MediaPlayer 개체를 재설정합니다.
  • seekTo(int msec) : 재생할 위치 지정(밀리초 단위 시간)
  • setAudioStreamType(int streamtype) : 스트리밍 미디어의 유형을 지정합니다.
  • setDisplay(SurfaceHolder sh) : 멀티미디어를 표시하도록 SurfaceHolder 설정
  • setLooping(boolean looping) : 반복 여부 설정
  • setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) : 네트워크 스트리밍 미디어의 버퍼링 모니터링
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listener) : 네트워크 스트리밍 미디어 재생의 끝을 듣습니다.
  • setOnErrorListener(MediaPlayer.OnErrorListener listener) : 오류 메시지 수신기 설정
  • setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) : 영상 사이즈 모니터링
  • setScreenOnWhilePlaying(boolean screenOn) : SurfaceHolder 표시 사용 여부 설정
  • setVolume(float leftVolume, float rightVolume) : 볼륨 설정
  • 시작 (): 재생 시작
  • 중지 (): 재생 중지

2. 코드 예제 사용

예 1 : MediaPlayer를 사용하여 오디오 재생:

실행 효과 다이어그램 :

키 코드 :

공개 클래스 MainActivity 확장 AppCompatActivity 구현 View.OnClickListener{ 

    비공개 버튼 btn_play; 
    비공개 버튼 btn_pause; 
    비공개 버튼 btn_stop; 
    비공개 MediaPlayer mPlayer = null; 
    개인 부울 isRelease = true; // 判断是否MediaPlayer是否释放的标志

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        bindViews(); 
    } 

    private void bindViews() { 
        btn_play = (버튼) findViewById(R.id.btn_play); 
        btn_pause = (버튼) findViewById(R.id.btn_pause);
        btn_stop = (버튼) findViewById(R.id.btn_stop);

        btn_play.setOnClickListener(이); 
        btn_pause.setOnClickListener(이); 
        btn_stop.setOnClickListener(이); 
    } 

    @Override 
    public void onClick(View v) { 
        switch (v.getId()){ 
            case R.id.btn_play: 
                if(isRelease){ 
                    mPlayer = MediaPlayer.create(this,R.raw.fly); 
                    isRelease = 거짓; 
                } 
                mPlayer.start(); //开始播放
                btn_play.setEnabled(false); 
                btn_pause.setEnabled(참); 
                btn_stop.setEnabled(참);
                부서지다; 
            케이스 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 디렉토리의 오디오 파일을 재생하고 create 메소드를 호출하여 MediaPlayer를 생성 처음으로 재생을 시작하기 전에 prepare()를 호출할 필요가 없습니다. prepare() 메서드를 한 번 호출합니다. ! 또한 공식 문서에서 다른 두 가지 방법으로 오디오를 재생하기 위한 샘플 코드를 게시합니다.

로컬 우리 :

우리 myUri = ....; // 여기에서 URI를 초기화합니다. 
MediaPlayer mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mediaPlayer.setDataSource(getApplicationContext(), myUri); 
mediaPlayer.prepare(); 
mediaPlayer.start();

외부 URL :

문자열 URL = "http://........"; // 여기 URL 
MediaPlayer mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mediaPlayer.setDataSource(url); 
mediaPlayer.prepare(); // 오래 걸릴 수 있습니다! (버퍼링 등을 위해) 
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="수직" 
    android:padding="5dp "> 

    <SurfaceView 
        android:id="@+id/sfv_show" 
        android:layout_width="match_parent" 
        android:layout_height="300dp" /> 

    <버튼 
        android:id="@+id/btn_start" 
        android:layout_width="wrap_content " 
        android:layout_height="wrap_content" 
        안드로이드:text="开始" /> 

    <버튼 
        android:id="@+id/btn_pause" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂停 " /> 

    <버튼 
        android:id="@+id/btn_stop" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="终止" /> 
    
</LinearLayout>

MainActivity.java :

공개 클래스 MainActivity 확장 AppCompatActivity 구현 View.OnClickListener, SurfaceHolder.Callback { 

    개인 MediaPlayer mPlayer = null; 
    개인 SurfaceView sfv_show; 
    비공개 SurfaceHolder surfaceHolder; 
    비공개 버튼 btn_start; 
    비공개 버튼 btn_pause; 
    비공개 버튼 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 = (버튼) findViewById(R.id.btn_start); 
        btn_pause = (버튼) findViewById(R.id.btn_pause);
        btn_stop = (버튼) 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(); 
                mPlayer.pause(); 
                break; 
                break;
            케이스 R.id.btn_pause: 
            케이스 R.id.btn_stop: 
                mPlayer.stop(); 
                부서지다; 
        } 
    } 

    @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가지 방법! 그런 다음 버튼 컨트롤 재생 및 일시 중지 ~


예 3: VideoView를 사용하여 비디오 재생

MediaPlayer + SurfaceView를 사용하여 비디오를 재생하는 것 외에도 VideoView를 사용하여 비디오를 직접 재생할 수 있으므로 약간의 변경으로 비디오 재생을 구현할 수 있습니다! 러닝 효과는 위와 같으니 붙여넣기 하지 않고 그냥 코드만 직접 올려주세요!

MainActivity.java :

공개 클래스 MainActivity 확장 AppCompatActivity 구현 View.OnClickListener { 

    private VideoView videoView; 
    비공개 버튼 btn_start; 
    비공개 버튼 btn_pause; 
    비공개 버튼 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 = (버튼) findViewById(R.id.btn_start); 
        btn_pause = (버튼) findViewById(R.id.btn_pause);
        btn_stop = (버튼) findViewById(R.id.btn_stop); 

        btn_start.setOnClickListener(이); 
        btn_pause.setOnClickListener(this); 
        btn_stop.setOnClickListener(this); 
        
        //파일 경로에 따라 재생 
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ) { 
            videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/lesson.mp4"); 
        } 

        //원시 디렉토리에 있는 파일 읽기 
        //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;
            케이스 R.id.btn_pause: 
                videoView.pause(); 
                부서지다; 
            케이스 R.id.btn_stop: 
                videoView.stopPlayback(); 
                부서지다; 
        } 
} 
    }

추천

출처blog.csdn.net/leyang0910/article/details/131905964