이 섹션 소개:
이 섹션은 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(); 부서지다; } } }