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) 다른 방법
: MediaPlayer를 사용하여 오디오 재생:예 1
- 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. 코드 예제 사용
렌더링 실행
:
키 코드
: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; } } }참고:
Res/raw 디렉터리에 있는 오디오 파일은 MediaPlayer를 처음 생성할 때 호출됩니다. prepare()를 다시 호출할 필요가 없습니다. 생성자 메서드를 사용하여 생성한 경우 prepare() 메서드를 한 번 호출하면 됩니다! 또한 공식 문서에 다른 두 채널의 오디오를 재생하기 위한 샘플 코드를 게시하세요.
Local Uri:External URLUri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
: 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을 통해 스트리밍하는 경우 온라인 오디오 파일을 재생하려면 파일이 다음을 수행할 수 있어야 합니다.
> MediaPlayer는 주로 오디오를 재생하는 데 사용되며 이미지 출력 인터페이스를 제공하지 않으므로 다른 도구를 사용해야 합니다.
MediaPlayer에서 재생되는 이미지 출력을 표시하는 구성 요소는 SurfaceView를 사용하여 표시할 수 있습니다. 아래에서는 SurfaceView를 사용하여 비디오 재생의 예를 작성할 수 있습니다. activity_main.xml예 2: MediaPlayer를 사용하여 동영상 재생
<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.java:
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를 사용하여 동영상을 재생하는 예제를 작성했습니다. 모두 매우 간단한 사용법입니다~ 누구나 쉽게 배울 수 있을 거라 믿습니다~ 감사합니다~