概述

Android多媒体框架支持各种常见的媒体类型,可以很容易地将音频、视频和图像集成到App中。通过MediaPlayer Api,可以从应用程序资源(RAW)、文件系统或网络上数据流资源来播放音频或视频。本文演示了如何通过Api播放音频和视频文件,来获得良好性能和愉快的用户体验,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

MediaPlayer 可以用来控制audio/video文件或流播放的类。通过此类,可以方便的控制音频/视频文件的播放,暂停和停止等操作。

Uri 统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。

VideoView 自带的一种播放视频的组件。

SurfaceView 可以通过后台绘制显示的视图组件。

Activity中播放音频

页面上播放音频文件,步骤如下:

1. 准备资源文件,并播放

1 privateMediaPlayer mMediaPlayer;2

3 /**

4 * 开始5 *@paramv6 */

7 public voidbn_start(View v){8 if(mMediaPlayer==null) {9 ready();10 }11 mMediaPlayer.start();12 }13

14 /**

15 * 创建MediaPlayer并到prepare状态16 */

17 private voidready(){18 if(mMediaPlayer==null){19 mMediaPlayer=new MediaPlayer();//Idle20 //Log.i("TAG", "ready: "+filePath);

21 File file=new File(Environment.getExternalStorageDirectory(),"goldfallen.mp3");22 Log.i("TAG", "ready: "+file.getPath());23 Log.i("TAG", "ready: "+file.exists());24 Uri uri=Uri.fromFile(file);25 try{26 mMediaPlayer.setDataSource(AudioActivity.this,uri);27 mMediaPlayer.prepare();//Prepared

28 } catch(IOException e) {29 Log.i("TAG", "ready: "+e.getMessage());30 e.printStackTrace();31 }32 }33 }

2. 暂停播放

1 /**

2 * 暂停3 *@paramv4 */

5 public voidbn_pause(View v){6 if(mMediaPlayer!=null &&mMediaPlayer.isPlaying()){7 mMediaPlayer.pause();8 }9 }

3. 停止

1 /**

2 * 停止3 *@paramv4 */

5 public voidbn_stop(View v){6 if(mMediaPlayer!=null &&mMediaPlayer.isPlaying()){7 mMediaPlayer.stop();8 mMediaPlayer.release();9 mMediaPlayer=null;10 }11 }

4. 释放资源(当页面销毁时,播放资源也要同时释放)

1 @Override2 protected voidonDestroy() {3 if(mMediaPlayer!=null &&mMediaPlayer.isPlaying()){4 mMediaPlayer.stop();5 mMediaPlayer.release();6 mMediaPlayer=null;7 }8 super.onDestroy();9 }

5. 通过静态函数创建对象

1 /**

2 * D:AndroidProjectDemoMediaappsrcmainesawA2012.mp3:3 * Error: 'A' is not a valid file-based resource name character:4 * File-based resource names must contain only lowercase a-z, 0-9, or underscore5 */

6 private voidready2(){7 if(mMediaPlayer==null){8 mMediaPlayer= MediaPlayer.create(this,R.raw.ab2012);9 }10 }

通过服务来播放音频

当页面关闭时,音频文件还可以在后台播放。步骤如下:

1. 定义后台服务,当服务启动时,创建MediaPlayer对象,并注册服务接收对象。

1 public class AudioService extendsService {2

3 privateMediaPlayer mMediaPlayer;4

5 privateOperatorReceiver mReceiver;6

7 publicAudioService() {8 }9

10 @Override11 public voidonCreate() {12 super.onCreate();13 mMediaPlayer=newMediaPlayer();14 mReceiver=newOperatorReceiver();15 IntentFilter filter=new IntentFilter("operator.receiver");16 registerReceiver(mReceiver,filter);17 }18

19 @Override20 publicIBinder onBind(Intent intent) {21 return null;22 }23

24 @Override25 public int onStartCommand(Intent intent, int flags, intstartId) {26 Log.i("TAG", "onStartCommand: ----ready ");27 ready();28 return super.onStartCommand(intent, flags, startId);29 }30

31 @Override32 public voidonDestroy() {33 if(mMediaPlayer!=null &&mMediaPlayer.isPlaying()){34 mMediaPlayer.stop();35 }36 if(mMediaPlayer!=null){37 mMediaPlayer.release();38 mMediaPlayer=null;39 }40 unregisterReceiver(mReceiver);41 super.onDestroy();42 }43

44 private voidstart(){45 mMediaPlayer.start();46 }47

48 private voidpause(){49 mMediaPlayer.pause();50 }51

52 private voidstop(){53 mMediaPlayer.stop();54 ready();55 }56

57 private voidready(){58 mMediaPlayer.reset();59 try{60 String filePath= Environment.getExternalStorageDirectory()+"/ab2012.mp3";61 Log.i("TAG", "ready: "+filePath);62 File file=newFile(filePath);63 if(file.exists()) {64 mMediaPlayer.setDataSource(filePath);65 mMediaPlayer.prepare();66 }else{67 Log.i("TAG", "ready: 文件不存在 ");68 }69 } catch(IOException e) {70 Log.i("TAG", "ready: "+e.getMessage());71 e.printStackTrace();72 }73 }74 }

2. 操作接收者定义如下:

1 /**

2 * 操作接收器3 */

4 class OperatorReceiver extendsBroadcastReceiver5 {6 @Override7 public voidonReceive(Context context, Intent intent) {8 int cmd=intent.getIntExtra("cmd",-1);9 Log.i("TAG", "onReceive: "+cmd);10 switch(cmd){11 caseTools.PLAY:12 start();13 break;14 caseTools.PAUSE:15 pause();16 break;17 caseTools.STOP:18 stop();19 break;20 default:21 start();22 break;23

24 }25 }26 }

3. 启动服务

1 Intent intent =new Intent(this,AudioService.class);2 startService(intent);

4. 前台Activity通过发送广播命令进行控制音频的播放与暂停

1 /**

2 * 开始3 *@paramv4 */

5 public voidbn_start(View v){6 Intent intent=new Intent("operator.receiver");7 intent.putExtra("cmd",Tools.PLAY);8 sendBroadcast(intent);9 Log.i("TAG", "bn_start: "+"service");10 }11

12 /**

13 * 暂停14 *@paramv15 */

16 public voidbn_pause(View v){17 Intent intent=new Intent("operator.receiver");18 intent.putExtra("cmd",Tools.PAUSE);19 sendBroadcast(intent);20 }21

22 /**

23 * 停止24 *@paramv25 */

26 public voidbn_stop(View v){27 Intent intent=new Intent("operator.receiver");28 intent.putExtra("cmd",Tools.STOP);29 sendBroadcast(intent);30 }

5.通过后台服务的方式,需要在AndroidManifest.xml文件中进行注册

1

3 android:enabled="true"

4 android:exported="true">

5

通过VideoView来播放视频

通过VideoView进行播放视频文件,只需要设置资源URI即可,具体如下:

1 privateVideoView mVideoView;2 @Override3 protected voidonCreate(Bundle savedInstanceState) {4 super.onCreate(savedInstanceState);5 setContentView(R.layout.activity_video);6 mVideoView= (VideoView) this.findViewById(R.id.vv_info);7 //设置路径

8 File file=new File(Environment.getExternalStorageDirectory(),"DCIM/Camera/VID20190629142614.mp4");9 Log.i("TAG", "onCreate: "+file.getPath());10 if(!file.exists()){11 Log.i("TAG", "onCreate: 文件不存在");12 }13 Uri uri=Uri.fromFile(file);14 mVideoView.setVideoURI(uri);15 //设置Media Controller

16 MediaController controller=new MediaController(this);17 mVideoView.setMediaController(controller);18 //获取焦点

19 mVideoView.requestFocus();20 mVideoView.start();21 //设置播放完成事件

22 mVideoView.setOnCompletionListener(newMediaPlayer.OnCompletionListener() {23 @Override24 public voidonCompletion(MediaPlayer mp) {25 Toast.makeText(VideoActivity.this, "播放完毕", Toast.LENGTH_SHORT).show();26 }27 });28 }

通过MediaPlayer来播放视频

通过MediaPlayer来播放视频文件,然后通过SurfaceView来显示视频内容,具体步骤如下:

1.启动,通过setDisplay来设置显示内容

1 public voidbn_start(View view) {2 mMediaPlayer.reset();//到Idle状态3 //设置路径

4 File file=new File(Environment.getExternalStorageDirectory(),"DCIM/Camera/VID20190629142614.mp4");5 Log.i("TAG", "onCreate: "+file.getPath());6 if(!file.exists()){7 Log.i("TAG", "onCreate: 文件不存在");8 } else{9 Log.i("TAG", "onCreate: 文件存在 ");10 }11 Uri uri=Uri.fromFile(file);12 try{13 mMediaPlayer.setDataSource(this,uri);14 mMediaPlayer.setDisplay(mSurfaceView.getHolder());15 mMediaPlayer.prepare();16 mMediaPlayer.start();17 } catch(IOException e) {18 e.printStackTrace();19 }20 }

2. 暂停与停止

1 public voidbn_pause(View view){2 if(mMediaPlayer.isPlaying()){3 mMediaPlayer.pause();4 }5 }6

7 public voidbn_stop(View view){8 if(mMediaPlayer.isPlaying()){9 mMediaPlayer.stop();10 }11 }

3. 资源释放

1 @Override2 protected voidonDestroy() {3 if(mMediaPlayer!=null &&mMediaPlayer.isPlaying()){4 mMediaPlayer.stop();5 }6 if(mMediaPlayer!=null){7 mMediaPlayer.release();8 mMediaPlayer=null;9 }10 super.onDestroy();11 }

权限设置

如果要播放视频,需要相应的权限设置,并在安装时获取请求权限

1

2

3

4

备注

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。

学android看什么视频,一起学Android之音频视频相关推荐

  1. android声音编辑器,音频视频编辑器app下载-Audio Video Editorv1.1.0 安卓版-腾牛安卓网...

    Audio Video Editor,一款功能强大的音频视频编辑器软件,拥有音频切割.音频合并.视频切割.视频合并.音频与视频合并等功能,不仅可以编辑手机铃声,还能够制作出优质视频. 软件介绍: MP ...

  2. 计算机网络(第7版) - 第八章 互联网上的音频/视频服务 - 习题

    第八章.互联网上的音频/视频服务 本章的习题 视频数据在因特网上传送所用的协议有哪些影响?既然现有的电信网能够传送音频/视频数据,并且能够保证质量,为什么还要用因特网来传送音频/视频数据呢?  区别: ...

  3. 各种音频视频编码方法

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  4. HTML5媒体(音频/视频)

    摘要: 在HTML5出现之前,web媒体大部分通过Flash来实现.这种方式造成了文件大加载慢,影响网站性能,开发难度高,维护麻烦,不易扩展等.这就导致HTML5自己开始支持媒体功能.HTML5 DO ...

  5. HTML-参考手册: HTML 音频/视频

    ylbtech-HTML-参考手册: HTML 音频/视频 1.返回顶部 1. HTML 音频/视频 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> ...

  6. 【计算机网络】互联网上的音频/视频服务

    总目录 物理层 数据链路层 网络层 运输层 应用层 网络安全 互联网的音频视频服务 无线网络和移动网络 文章目录 总目录 概述 多媒体信息的特点 音视频服务的类型 流式存储音频/视频 媒体服务器 实时 ...

  7. HTML 音频/视频参考手册

    HTML5 视频和音频的 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> 元素提供了方法.属性和事件. 这些方法.属性和事件允许您使用 JavaS ...

  8. video/audio 音频/视频 标签详解

    video <video> 标签定义视频,比如电影片段或其他视频流. 可以在 <video> 和 </video> 标签之间放置文本内容,这样不支持 <vid ...

  9. 平凡前端之路_03.HTML5的音频视频多媒体

    文章目录 HTML5音频视频 HTML5音频 HTML5视频 HTML5音频视频常用属性 HTML5音频视频常用方法 HTML5音频视频常用事件 HTML5音频视频特殊属性 浏览器不支持音频视频自动播 ...

  10. HTML 事件、音频/视频

    HTML 事件属性 全局事件属性 HTML 4 的新特性之一是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript. 如果你想学习更多关于事件 ...

最新文章

  1. c++中的变量作用范围
  2. 异步asynctask
  3. 处理效应模型stata实例_stata︱政策处理效应模型sata基本命令汇总
  4. [html] html标签的属性值是否可以省略引号?为什么?
  5. python编写脚本pdf_你用 Python 写过哪些有趣的脚本?
  6. java读取propertiesshib,Java CommonUtils.constructServiceUrl方法代码示例
  7. Aptana Studio 介绍
  8. for的部分使用方法
  9. 消费贷之京东白条、蚂蚁花呗和银行信用卡的那些分期“低费率”套路
  10. 【原创】基于FPGA的SDRAM控制器设计—自动刷新设计
  11. EDM邮件制作遇到的兼容性问题
  12. 运营进阶:产品运营画布九要素
  13. axure8屏幕滚动_Axure8原型教程:实现滚动效果(小技巧:隐藏滚动条)
  14. vbscript下载文件(使用https绕过无效的证书错误)
  15. 截屏、文字提取一气呵成,超实用 OCR 开源小工具
  16. 京东零售大数据云原生平台化实践
  17. m227fdw恢复出厂设置_HP各种打印机恢复出厂设置的方法
  18. Windows Docker Desktop 无法启动报错 Docker Desktop is shutting down 的可能解决办法
  19. 在cmd命令中写oracle语句
  20. mac上最好用的5款epub阅读器

热门文章

  1. 20_数组的常见操作
  2. 自己常用的一些Shell命令
  3. 浅谈flowers问题
  4. HarmonyOS支持机型,股市精忠社知识百科:HarmonyOS支持90%机型
  5. 2016百度-裁减网格纸-Java
  6. SPSS Modeler决策树算法比较
  7. jsp学生补助申请管理系统
  8. 添加对象html页面上,在网页中插入对象.ppt
  9. 电子商务网站的设计与实现(三):四大子系统,登录-账务-前端-后端
  10. java中getimag什么意思_Java ImageIcon.getImage方法代碼示例