安卓学习笔记2——视频和音频的播放

工程文档:点击打开链接

一.视频播放

视频播放一般有两种方式,使用videoview控件,或者使用MediaPlayer配合surfaceView。本文中,我们采用的方法是使用videoview,因为videoview操作简单,适合初学者,至于后者,我将会在后一篇文章中再做介绍。
首先是有关videoview的各常用方法。
我们可以使用setMediaCOntroller为videoview设置控制器,而videoview的控制器的主要方法如下。
拥有以上的方法,我们就可以使用videoview来播放视频了。
1. 定义
	private static final String PATH_STRING = "/mnt/sdcard/test.mp4";//定义视频文件的路径,test.mp4文件我们已经事先放在sdcard中
	VideoView videoView; 
	MediaPlayer mediaPlayer;

2.初始化,包括视频文件的加载,设置控制器
	videoView.setVideoPath(PATH_STRING);                          
	videoView.setMediaController(new MediaController(this));              //为videoMedia设置控制器


3.现在万事具备,只欠东风,只需使用strat命令即可播放视频
	videoView.start();

4.此外,如果需要暂停,则使用pause,需要停止则使用stop,
在暂停后再次使用start则可以继续播放。
	if(isVideoPause==false){
		videoPosition = videoView.getCurrentPosition();
		videoView.pause();
		isVideoPause = true;
	}
	else{
		videoView.start();
		isVideoPause = false;
	}
5.最后提一点遇到的小问题,在使用eclipse调试连接手机时,手机是无法读取sdcard的,所以也就无法播放sdcard中的视频文件了,所以千万不要试图在手机还连接电脑的时候播放视频文件。

二.使用soundPool实现音频播放

SoundPool介绍:
用途:
可以用soundpool,用soundpool可以播一些短的反应速度要求高的声音。
优点:
1. SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作。
2. SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,而MediaPlayer类是同步执行的只能一个文件一个文件的播放。
缺点:

   1.SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌曲或者做游戏背景音乐。这里一定需要注意不要试图将超过1M的音频加载到soundpool中。

  2.SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,但是有的朋友在G1中测试它还是有100ms左右的延迟,这可能会影响用户体验。也许这不能管SoundPool本身,因为到了性能比较好的Droid中这个延迟就可以让人接受了。

下面来介绍下soundpool相关的方法。

构造方法:

SoundPool(int maxStreams, int streamType, int srcQuality);
macStreams: 能够加载的最大音频数量

streamType: 能够加载的音频类型,一般使用AudioManager.STREAM_MUSIC

srcQuality: 目前没有用,一般为1

int load(Context context, int resId, int priority); 返回音频 stream的id

context:承接上下文,一般使用this

resID:资源文件id

priority:目前没有作用,一般设为1

play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate); 返回播放音频的id

soundID: 音频stream的id。使用load方法的返回值

leftVolume:左声道音量

rightColume:右声道音量,使用1即可

priority:优先级:0-9, 0优先度最低

loop重复播放的次数,0为播放一次

rate:播放速率,1为正常速率。

pause(int streamID);暂停音频

参数为play返回的streamID。注意每次play相同的音频时,返回的streamID都是不同的。所以为了暂停上次的音乐,则需要用一个变量记录play的返回值。

使用步骤:

1.

	soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);

2. 一般使用hashMap对象来管理音频对象。在工程res文件夹中增加raw文件夹,将sound2音频文件复制到该文件夹。

	soundMap = new HashMap<Integer, Integer>();
	soundMap.put(1, soundPool.load(this,R.raw.sound2 , 1));

3.播放,现在可以使用play播放了,返回的id为streamID,在pause中可以使用这个变量来暂停播放音频。

	id = soundPool.play(soundMap.get(1), 1, 1, 1, 0, 1);


4.暂停

	soundPool.pause(id);

三.使用mediaplayer播放音乐

mediaplayer与soundPool不同,其播放的音乐一般较长,如游戏的背景音乐,能够播放的音频文件没有容量的限制,但是在同一时刻同一mediaplayer只能够播放一个音频。


相关方法:

MediaPlayer android.media.MediaPlayer.create(Context context, int resid)

context:承接上下文,一般为this

resid:资源id

MediaPlayer.start(); 播放音频文件。

mediaPlayer.pause(); 停止播放音频文件


使用步骤:

1.mediaplayer的定义和实例化。

	MediaPlayer mediaPlayer;
其中我已事先将test文件放到res的raw文件夹中,如果没有这个文件夹,可以自己创建一个。
	mediaPlayer = MediaPlayer.create(this, R.raw.test);

2.播放

        mediaPlayer.start();



四.注意事项

下面是我在学习上面三个知识点时候遇到的编程问题,上面也已经有提到,这里再整理罗列一下,可能很多朋友也会遇到这样的问题。
1. soundPool的加载需要一定的时间,如果在还未 加载好之前使用play播放是无法播放的,在LogCat中会报warning:Sample x is not ready.
为了防止这样的问题的发生,可以在load的后面加一个Thread.sleep()。或者
为完成加载设置监听函数
     soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
               
           public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                    // TODO Auto-generated method stub
                    isReady = 1;   //只有isReady  ==1的时候才能播放音频
                   }
     });
2. play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate); 中的优先级要在0-9的区间之内,否则播放会有问题,
会报错:cann't create the track state-12
3.soundPool最多加载1M大小的文件。
4. soundPool中的pause(streamId)play方法返回值,每次play音频,返回的streamId都会加一,所以如果想要暂停最近一次播放的音频,则需要记录返回的streamId。
5.在手机连接电脑调试时无法读取sdcard,也就无法播放sdcard中的视频文件。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值