第十一章 多媒体应用开发

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控件:

<VideoViewandroid: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控件

<SurfaceViewandroid: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类只可以播放音频不可以播放视频

Androi移动开发基础相关推荐

  1. 虚幻引擎虚拟现实开发基础学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...

  2. 虚幻引擎C++编程游戏开发基础

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:23.8 GB |时长:44h 59m ...

  3. 2017-2018-2 20165236 实验四《Android开发基础》实验报告

    2017-2018-2 20165236 实验四<Android开发基础>实验报告 一.实验报告封面 课程:Java程序设计       班级:1652班       姓名:郭金涛     ...

  4. Android游戏开发基础part2--Canvas画布

    游戏开发基础part2--Canvas画布 又过了一周才继续做总结,四级结束了,应该可以多点时间学习游戏编程了. Canvas画布类是一个在游戏当中担当非常重要的角色,它可以绘制出不同的图形和图片,可 ...

  5. 一起谈.NET技术,asp.net控件开发基础(18)

    本篇继续上篇的讨论,可能大家已经在使用asp.net2.0了,DataSource属性不再使用,而是跟数据源控件搭配使用.现在讨论的绑定技术都是基于1.1版本,先熟悉一下,本质上是一样的,这样一步步的 ...

  6. android界面数据存储,Android应用开发基础之数据存储和界面展现(二)

    Android应用开发基础之数据存储和界面展现(二) 常见布局 相对布局 RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRight ...

  7. SP 短信开发-基础知识篇

    SP 短信开发-基础知识篇 很土的话题,但是最近帮朋友做这个东西,所以写点东西出来给初学者参考. 一.准备资料 SP开发资料网站上有很多,但是主要是以下几个文档: 1.MISC1.6 SP订购通知接口 ...

  8. 【读书笔记《Android游戏编程之从零开始》】16.游戏开发基础(动画)

    1. Animation动画 在Android 中,系统提供了动画类 Animation ,其中又分为四种动画效果: ● AlphaAnimation:透明度渐变动画 ● ScaleAnimation ...

  9. os-cocos2d游戏开发基础-进度条-开发笔记

     os-cocos2d游戏开发基础-进度条-开发笔记(十)   ios-cocos2d游戏开发基础-游戏音效-开发笔记(九)       ios-cocos2d游戏开发基础-CCLayer和Touch ...

最新文章

  1. “为啥Kaggle奖金那么少?”一场25000美元的比赛,却因“抠门”引发激烈讨论...
  2. Oracle用户创建及设置
  3. win7的python3.5安装numpy包
  4. 【河南省多校脸萌第六场 E】LLM找对象
  5. 定制iOS 7中的导航栏和状态栏
  6. 华为鸿蒙系统学习笔记5-华为方舟编译器正式开源及相关源码下载
  7. java关键字_Java关键字
  8. php 小米路由器_云水日记-捣鼓小米路由器开发版本
  9. 一文2600字超全RF接口自动化框架项目实战【建议收擦】
  10. 物理学家揭示深度学习原理:神经网络与宇宙本质惊人关联
  11. 双代号网络图节点编号原则_网络绘图进行的节点编号时原则
  12. Anbox安卓apk应用安装及使用说明和常见问题
  13. 叶俊——“新零售·新未来”米友圈第九届全国精英总裁班授课圆满落幕
  14. 道格拉斯普克算法(简化线段点)
  15. 如何欺骗神经网络,让它把熊猫识别为秃鹫
  16. 如何使用JMX_Expoter+Prometheus+Grafana监控Hadoop集群
  17. 360浏览器的404报错页
  18. 如何使用pr的超级键效果-达到蒙版的效果
  19. 企业的财务部门为什么要用内网即时通讯软件
  20. (收藏)【 数字化客户体验】NPS、CSAT和CES——2020年跟踪的客户满意度指标

热门文章

  1. AI万物生成技术,颠覆内容传统创作模式 | iBrandUp 职位内推
  2. 二十二、商城 - 商品录入-FastDFS(10)
  3. ddr走线教程_Xilinx FPGA的DDR走线规则
  4. Zeppelin集成Spark3
  5. ieee 802.3学习笔记-MII
  6. 关于qq邮箱 该文件已达到200次的下载限制,您已不能下载该文件 的问题处理
  7. 将串口转换成TCP连接
  8. 明日之后各个服务器的信息,明日之后三个字的和四个字的区什么不同 服务器区别详解...
  9. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析
  10. 美国服务器与日本服务器哪个比较好鬼影互联推举