Android中的音频视屏相关(多媒体2)

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

一、MediaPlayer的简介

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

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

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

                                      

二、示例(播放音频)

        //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框架

可以播放市面上大部分格式,同样也是对MediaPlayer的封装、扩展。

七、总结

①由于C语言有操作硬件的能力 ,java没有  ,因此mediaPlayer只是上层应用,会通过jni实现native来调用c(c++)进而操作硬件的音乐播放。
②当使用的资源是从网络获取的时候,一定要使用设置的资源是网络资源 要用player.prepareAsync(),此方法是异步的。
③实际应用中,如果只是实现播放功能,就可以使用第三方框架;如果真正去开发播放器,就得用到MediaPlayer,甚至更底层的c(FFmpeg是由几十个C程序员开源项目,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序)。
*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值