引言:多媒体:(包含文字 图片 音频 视频)

一、MediaPlayer的简介

请看官方文档介绍:MediaPlayer class can be used to control playback of audio/video files and streams.

意思是:媒体播放器类可用于控制音频/视频文件和流的播放。

同时MediaPlay有生命周期,如下:

                                      

android AliPlayer当前进度 android player是什么_ide

二、示例(播放音频)


//1.创建一个MediaPlayer对象
        MediaPlayer player = new MediaPlayer();
		// 2.设置要播放的资源 path 可以是本地也可以是网络
		try {
			player.setDataSource(Environment.getExternalStorageDirectory()
					.getPath() + "/xpg.mp3");
			// 3.准备播放
			player.prepare();
			// 设置一个准备完成的监听(设备准备完成后,回调)
			player.setOnPreparedListener(new OnPreparedListener() {

						@Override
						public void onPrepared(MediaPlayer mp) {
							// 4.开始播放
							player.start();
						}
					});
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	    player.
	    player.stop();



三、生命周期(略)



四、示例(播放视频)

①播放视频需要用到一个控件,即:SurfaceView 。
②SurfaceView   介绍:


surfaceview 控件是一个重量级控件 ,内部维护了2个线程 。工作原理:假如有A,B线程,
   A 获取数据  负责显示 
   B 负责显示  获取数据       两者交替进行。
surfaceview 可以直接在子线程更新ui (补充: 与进度相关的控件可以直接在子线程更新ui )。


SurfaceView播放视频,只支持 3gp、MP4格式 。


③示例代码:


final SurfaceHolder surfaceHolder = sfv.getHolder();(sfv是显示视频的控件SurfaceView)
		//添加一个callback
		surfaceHolder.addCallback(new Callback() {
			//当surfaceView销毁的时候调用
			@Override
			public void surfaceDestroyed(SurfaceHolder holder) {
				System.out.println("surface destroyed");
				if(player!=null&&player.isPlaying()){
					currentPosition = player.getCurrentPosition();
					player.stop();
					
				}
			}
			//当surfaceview初始化了
			@Override
			public void surfaceCreated(SurfaceHolder holder) {
			    //1.创建MediaPlayer对象
				player = new MediaPlayer();
				// 2.设置要播放的资源 path 可以是本地也可以是网络
				try {
					player.setDataSource(Environment.getExternalStorageDirectory()
							.getPath() + "/oppo.mp4");

					// 2.1设置播放视频的内容SurfaceHolder 是用来维护视频播放的内容
					player.setDisplay(surfaceHolder);
					// 3.准备播放,注意:设置的资源是网络资源 要用player.prepareAsync()异步
					player.prepare();
					// 设置一个准备完成的监听
					player.setOnPreparedListener(new OnPreparedListener() {
						@Override
						public void onPrepared(MediaPlayer mp) {
							// 4.开始播放
							player.start();
							//继续上次的位置播放
							player.seekTo(currentPosition);
						}
					});

				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			//表面发生变化
			@Override
			public void surfaceChanged(SurfaceHolder holder, int format, int width,
					int height) {
				// TODO Auto-generated method stub
				
			}
		});





五、组件介绍(VideoView)



这个控件其实就是对 SurfaceView 和 MediaPlayer 进行封装。使用起来更加简单。





六、vitamio框架




七、总结


①由于C语言有操作硬件的能力 ,java没有  ,因此mediaPlayer只是上层应用,会通过jni实现native来调用c(c++)进而操作硬件的音乐播放。


②当使用的资源是从网络获取的时候,一定要使用设置的资源是网络资源 要用player.prepareAsync(),此方法是异步的。


③实际应用中,如果只是实现播放功能,就可以使用第三方框架;如果真正去开发播放器,就得用到MediaPlayer,甚至更底层的c(FFmpeg是由几十个C程序员开源项目,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序)。


*