Androi移动开发基础

本文详细介绍了Android中MediaPlayer类和SoundPool在音频播放方面的应用,包括MediaPlayer的内存管理、音频类型设置、网络音频支持,以及SoundPool的音频并发播放能力。同时涵盖了VideoView和SurfaceView在视频播放中的使用。重点在于MediaPlayer的局限性和SoundPool的优势,以及常见开发实践和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第十一章 多媒体应用开发

11.1 音频播放

11.1.1 使用MediaPlayer类播放音频

占用内存资源较多,且不支持同时播放多个音频
Media常用方法如下:
setDataSource():设置要播放的音频文件的位置
prepare():在开始播放之前调用这个方法完成准备工作
start():开始或继续播放音频
pause():暂停播放音频
reset():重置 MediaPlayer对象
seekTo():从指定位置开始播放音频
stop():停止播放音频,调用该方法后MediaPlayer对象无法再播放音频
release():释放掉与MediaPlayer对象相关的资源
isPlaying():判断当前是否正在播放音频
getDuration():获取载入的音频文件的时长

1. 实例化MediaPlayer类

MediaPlayer mediaPlayer=new MediaPlayer();//创建MediaPlayer对象
mediaPlayer.setAudioStreanmType(AudioManager.STREAM_MUSIC);//设置音频类型

常用的音频类型:
AudioManager.STREAM+MUSIC:音乐
AudiManager.STREAM_RING:响铃
AudioManager.STREAM_ALARM:时钟
AudioManager.STREAM_NOTIFICATION:提示音
2.设置数据源

//设置播放应用自带的音频文件
mediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.xxx);
//设置播放SD卡中的音频文件
mediaPlayer.setDataSource("sd卡中的音频文件路径");
//设置播放网络音频文件
mediaPlayer.setDataResource("");

注意:在播放网络中的音频文件时,需要在清单文件中添加访问网络的权限

< uses-permission android:name="android.permission.INTERNET"/>

3.播放音频文件
一般在调用start()方法播放音频文件前,程序会调用prepare()方法或prepareAsync()方法将音频文件解析到内存中。调用prepare()方法解析音频文件为同步操作,调用prepareAsync()方法解析音频文件为异步操作,一般用于解析较大的文件,是子线程中执行的异步操作,不管他是否执行完毕,都不会影响主线程操作。
用create()方法创建MediaPlayer对象并设置音频文件时,不能调用prepare()方法,直接调用start()方法播放音频文件即可
播放小音频文件:

mediaPlayer.prepare();
mediaPlayer.strat();

播放大音频文件:

mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new OnPreparedListener{
	public void OnPrepared(MediaPlayer media){
		player.start();
	}
})

4.暂停播放

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
	mediaPlayer.pause();
}

5.重新播放

//播放状态下重新播放
if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
	mediaPlayer.seekTo(0);
	return;
}
//暂停状态下重新播放
if(mediaPlayer!=null){
	mediaPlayer.seekTo(0);
	mediaPlayer.start();
}

6.停止播放

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
	mediaPlayer.stop();//停止播放
	mediaPlayer.release();//释放资源
	mediaPlayer=null;
}

11.1.2 使用SoundPool播放音频

可以同时播放多个短小的音频
load():加载音频文件
play():播放音频
pause(int streamID):根据加载的资源ID,暂停播放音频
resume(int streamID):根据加载的资源ID,继续播放暂停的音乐资源
stop(int streamID):根据加载的资源ID,停止音频资源的播放
unload(int streamID):从音频池中卸载音频资源id为streamID的资源
release():释放音频池资源

1.SoundPool对象
public SoundPool(int maxStreams,int streamType,int srcQuality)
maxStream:指定可以容纳多少个音频
streamType:指定音频类型
srcQuality:用于指定音频的品质,默认为0
2. 加载音频文件
public int load(Context context,int resID,int priority)
resID:指定的资源ID
priority:播放声音的优先级
public int load(String path,int priority)
path:音频文件路径
public int load(AssetFileDescriptor afd,int priority)
AssertFileDescriptor:对应的文件
public int load(FileDescriptor fd,long offset,long length,int priority)
从offset开始长度为length的音频
3.播放音频
play(int sounID,float leftVolume,float RightVolume,int priority,int loop,float rate)
soundID:要播放的音频ID,该音频是通过load()方法返回的音频
leftVolume:左声道的音量,0.0~1.0
RightVolume:右声道的音量,0.0~1.0
priority:播放音频的优先级,数值越大,优先级越高
loop:指定循环播放的次数,0表示不循环,-1表示循环
rate:指定播放速率,1表示正常播放速度,0.5表示低播放速率,2表示最高播放速率

11.2视频播放

11.2.1 使用VideoView控件播放视频

1.常用方法
setVideoPath()设置播放的视频文件的位置
start() 开始或继续播放视频
pause()暂停播放视频
resume()将视频重新开始播放
seekTo()从指定位置开始播放视频
isPlaying()判断当前是否正字播放视频
getDuration()获取载入的视频文件的时长

在布局文件中添加VideoView控件:

<VideoView
	android:id="@+id/videoview"
	android:layout_width="match_parent"
	android:layout_height="match_parent"/>

视频的播放

VideoView videoView=findViewById(R.id.videoview);
videoView.setVideoPath("");//播放本地视频
videoview.setsetVideoURI("");//播放网络视频
videoView.start();

注意:播放网络视频时,在AndroiManifest.xml文件中的标签中添加访问网络的权限

<uses-permission android:name="android.permission.INTERNET"/>

为VideoView控件添加控制器

MediaController controller=new MediaController(context);
mediaView.setMediaController(controller);//为VideoView控件绑定控制器

11.2.3使用MediaPlayer和SurfaceView控件播放视频

SurfaceView控件用于显示视频图像,继承自View,有双缓冲技术
1.在布局文件中添加SurfaceView控件

<SurfaceView
	android:id="@+/surfaceview"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"/>

2.获取界面控件并设置类型

SurfaceView view=findViewById(R.id.surfaceview);
SurfaceHolder=view.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFER);
//SURFACE_TYPE_PUSH_BUFFER:SurfaceView控件不包含原生数据,用到的数据由MediaPlayer对象提供,也就是不让SurfaceView控件维护双缓冲区,而是交给MediaPlayer底层去管理

3.回调ADDCallback()方法
使用SurfaceView控件时,一般情况下还要对其创建、销毁、改变时的状态进行监听,此时需要调用回调方法,在该方法中监听Surface的状态

holder.addCallback(){
	public void surfaceDestroyed(SurfaceHolder holder){
		Log.i("TAG","surface被销毁了");
	}
	public void surfaceCreated(SurfaceHolder holder){
		Log.i("TAG","surface被创建好了");
	}
	public void surfaceChanged("TAG","surface的大小发生变化");
}

4.播放视频

MediaPlayer mediaPlayer=new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource("视频资源路径");
mediaPlayer.setDisplay(holder);
mediaPlayer.prepareAsync();
mediaPlayer.start();

习题

下列关于MediaPlayer类的叙述,错误的是:D
A.MediaPlayer类是播放音频和视频的
B.MediaPlayer类对音频文件提供了非常全面的控制方法
C.MediaPlayer类会调用底层的音频驱动播放音频
D.MediaPlayer类只可以播放音频不可以播放视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值