Media(播放器)

一、使用VideoView播放视频
1、读取放在raw目录下的文件

String uri = "android.resource://" + getPackageName() + "/" + R.raw.lesson;
videoView.setVideoURI(Uri.parse(uri));

2、//根据文件在SD卡中的路径播放

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){   
     String strPath = Environment.getExternalStorageDirectory().getCanonicalPath()+ "/lesson.mp4";  
     videoView.setVideoPath(strPath);

}

二、使用MediaPlayer播放视频
1)获得MediaPlayer实例:

MediaPlayer mp = new MediaPlayer();
MediaPlayer mp = MediaPlayer.create(this, R.raw.test); //无需再调用setDataSource

另外create还有这样的形式: create(Context context, Uri uri, SurfaceHolder holder) 通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器

2)设置播放文件:
播放的是res/raw目录下的音频文件,创建MediaPlayer调用的是create方法,第一次启动播放前 不需要再调用prepare(),如果是使用构造方法构造的话,则需要调用一次prepare()方法!MediaPlayer主要用于播放音频,没有提供图像输出界面,所以我们需要借助其他的 组件来显示MediaPlayer播放的图像输出,我们可以使用用SurfaceView 来显示。

//①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文件夹平级的assets文件夹里,然后使用下述代码设置DataSource:

AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());

3)其他方法

getCurrentPosition( ):得到当前的播放位置
getDuration() :得到文件的时间
getVideoHeight() :得到视频高度
getVideoWidth() :得到视频宽度
isLooping():是否循环播放
isPlaying():是否正在播放
pause():暂停
prepare():准备(同步)
prepareAsync():准备(异步)
release():释放MediaPlayer对象
reset():重置MediaPlayer对象
seekTo(int msec):指定播放的位置(以毫秒为单位的时间)
setAudioStreamType(int streamtype):指定流媒体的类型
setDisplay(SurfaceHolder sh):设置用SurfaceHolder来显示多媒体
setLooping(boolean looping):设置是否循环播放
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener): 网络流媒体的缓冲监听
setOnCompletionListener(MediaPlayer.OnCompletionListener listener): 网络流媒体播放结束监听
setOnErrorListener(MediaPlayer.OnErrorListener listener): 设置错误信息监听
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener): 视频尺寸监听
setScreenOnWhilePlaying(boolean screenOn):设置是否使用SurfaceHolder显示
setVolume(float leftVolume, float rightVolume):设置音量
start():开始播放
stop():停止播放

三、使用SoundPool播放音效
1)构造方法:
SoundPool(int maxStreams, int streamType, int srcQuality) 参数依次是:
①指定支持多少个声音,SoundPool对象中允许同时存在的最大流的数量。
②指定声音类型,流类型可以分为STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSICSTREAM_ALARM四种类型。在AudioManager中定义。
③指定声音品质(采样率变换质量),一般直接设置为0!

在低版本中可以用上述构造方法,而API 21(Android 5.0)后这个构造方法就过时了! 而用到一个SoundPool.Builder的东东,我们要实例化SoundPool只需调用:

SoundPool.Builder spb = new SoundPool.Builder();
spb.setMaxStreams(10);

 //转换音频格式
spb.setAudioAttributes(null);

//创建SoundPool对象
SoundPool sp = spb.build(); 

2)常用方法介绍:
加载声音资源

load(Context context, int resId, int priority)
load(String path, int priority)
load(FileDescriptor fd, long offset, long length, int priority)
load(AssetFileDescriptor afd, int priority) 上述方法都会返回一个声音的ID,后面我们可以通过这个ID来播放指定的声音

参数介绍
context:上下文
resId:资源id
priority:没什么用的一个参数,建议设置为1,保持和未来的兼容性
path:文件路径
FileDescriptor:貌似是流吧,这个我也不知道
AssetFileDescriptor:从asset目录读取某个资源文件,用法: AssetFileDescriptor descriptor = assetManager.openFd("biaobiao.mp3");

播放控制
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

参数依次是:
soundID:Load()返回的声音ID号
leftVolume:左声道音量设置
rightVolume:右声道音量设置
priority:指定播放声音的优先级,数值越高,优先级越大。
loop:指定是否循环:-1表示无限循环,0表示不循环,其他值表示要重复播放的次数
rate:指定播放速率:1.0的播放率可以使声音按照其原始频率,而2.0的播放速率,可以使声音按照其 原始频率的两倍播放。如果为0.5的播放率,则播放速率是原始频率的一半。播放速率的取值范围是0.5至2.0。

资源释放
可以调用release()方法释放所有SoundPool对象占据的内存和资源,当然也可以根据声音 ID来释放!

3).OnLoadCompleteListener监听声音文件是否加载完毕

mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { 
    @Override 
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {  
             Toast.makeText(MainActivity.this,"加特技准备完毕~",Toast.LENGTH_SHORT).show(); 
    }
});

推荐阅读更多精彩内容

  • 安卓平台和声音录制与播放相关的主要是4个类:MediaRecorder,MediaPlayer,SoundPool...
    闲庭阅读 9,102评论 1 46
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 131,686评论 18 138
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 5,506评论 0 17
  • 相信大家在开发过程中,可能会有这些场景,点赞需要音效,弹窗需要音效,那么怎么实现呢?可以通过MediaPlayer...
    优疏阅读 1,859评论 0 5
  • 我最先要感恩的是我的老师,她每天都教我们知识,关注我们的成长,妈妈说,老师是和我没有血缘关系,确是对我最好的人...
    周绪凤阅读 299评论 0 7
  • 一次次的安慰自己做朋友就好,又难过不能陪你到最后。吵完架之后你会放下你的傲娇来和我道歉,小心翼翼像个孩子。 看着高...
    今山事阅读 267评论 0 0
  • 问题 点击google搜索结果后,不是直接访问目标链接,而是要跳转到Google服务器,以便Google分析和挖掘...
    MountainKing阅读 1,686评论 0 0
  • 莽撞年纪 荒唐岁月 时光之外 锦字之间 年华深处 浅纸素画说流年
    此山中阅读 161评论 0 0