本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。

先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面是播放/停止视频,也是用SeekBar来调进度:

main.xml的源码:

XML/HTML代码
  1. <linearlayout android:id="@+id/LinearLayout01"
  2. android:layout_width="fill_parent" android:layout_height="fill_parent"
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical">
  5. <seekbar android:id="@+id/SeekBar01" android:layout_height="wrap_content"
  6. android:layout_width="fill_parent">
  7. <linearlayout android:id="@+id/LinearLayout02"
  8. android:layout_width="wrap_content" android:layout_height="wrap_content">
  9. <button android:id="@+id/Button01" android:layout_width="wrap_content"
  10. android:layout_height="wrap_content" android:text="播放音频">
  11. <button android:id="@+id/Button02" android:layout_width="wrap_content"
  12. android:layout_height="wrap_content" android:text="停止播放">
  13. <seekbar android:id="@+id/SeekBar02" android:layout_height="wrap_content"
  14. android:layout_width="fill_parent">
  15. <surfaceview android:id="@+id/SurfaceView01"
  16. android:layout_width="fill_parent" android:layout_height="250px">
  17. <linearlayout android:id="@+id/LinearLayout02"
  18. android:layout_width="wrap_content" android:layout_height="wrap_content">
  19. <button android:layout_width="wrap_content"
  20. android:layout_height="wrap_content" android:id="@+id/Button03"
  21. android:text="播放视频">
  22. <button android:layout_width="wrap_content"
  23. android:layout_height="wrap_content" android:text="停止播放" android:id="@+id/Button04">

本文程序的源码,有点长:

Java代码
  1. package com.testMedia;
  2. import java.io.IOException;
  3. import java.util.Timer;
  4. import java.util.TimerTask;
  5. import android.app.Activity;
  6. import android.media.AudioManager;
  7. import android.media.MediaPlayer;
  8. import android.os.Bundle;
  9. import android.view.SurfaceHolder;
  10. import android.view.SurfaceView;
  11. import android.view.View;
  12. import android.widget.Button;
  13. import android.widget.SeekBar;
  14. import android.widget.Toast;
  15. public class testMedia extends Activity {
  16. /** Called when the activity is first created. */
  17. private SeekBar skb_audio=null;
  18. private Button btn_start_audio = null;
  19. private Button btn_stop_audio = null;
  20. private SeekBar skb_video=null;
  21. private Button btn_start_video = null;
  22. private Button btn_stop_video = null;
  23. private SurfaceView surfaceView;
  24. private SurfaceHolder surfaceHolder;
  25. private MediaPlayer m = null;
  26. private Timer mTimer;
  27. private TimerTask mTimerTask;
  28. private boolean isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突
  29. @Override
  30. public void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.main);
  33. //----------Media控件设置---------//
  34. m=new MediaPlayer();
  35. //播放结束之后弹出提示
  36. m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
  37. @Override
  38. public void onCompletion(MediaPlayer arg0) {
  39. Toast.makeText(testMedia.this, "结束", 1000).show();
  40. m.release();
  41. }
  42. });
  43. //----------定时器记录播放进度---------//
  44. mTimer = new Timer();
  45. mTimerTask = new TimerTask() {
  46. @Override
  47. public void run() {
  48. if(isChanging==true)
  49. return;
  50. if(m.getVideoHeight()==0)
  51. skb_audio.setProgress(m.getCurrentPosition());
  52. else
  53. skb_video.setProgress(m.getCurrentPosition());
  54. }
  55. };
  56. mTimer.schedule(mTimerTask, 0, 10);
  57. btn_start_audio = (Button) this.findViewById(R.id.Button01);
  58. btn_stop_audio = (Button) this.findViewById(R.id.Button02);
  59. btn_start_audio.setOnClickListener(new ClickEvent());
  60. btn_stop_audio.setOnClickListener(new ClickEvent());
  61. skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);
  62. skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());
  63. btn_start_video = (Button) this.findViewById(R.id.Button03);
  64. btn_stop_video = (Button) this.findViewById(R.id.Button04);
  65. btn_start_video.setOnClickListener(new ClickEvent());
  66. btn_stop_video.setOnClickListener(new ClickEvent());
  67. skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);
  68. skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());
  69. surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
  70. surfaceHolder = surfaceView.getHolder();
  71. surfaceHolder.setFixedSize(100, 100);
  72. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  73. }
  74. /*
  75. * 按键事件处理
  76. */
  77. class ClickEvent implements View.OnClickListener{
  78. @Override
  79. public void onClick(View v) {
  80. if(v==btn_start_audio)
  81. {
  82. m.reset();//恢复到未初始化的状态
  83. m=MediaPlayer.create(testMedia.this, R.raw.big);//读取音频
  84. skb_audio.setMax(m.getDuration());//设置SeekBar的长度
  85. try {
  86. m.prepare();        //准备
  87. } catch (IllegalStateException e) {
  88. // TODO Auto-generated catch block
  89. e.printStackTrace();
  90. } catch (IOException e) {
  91. // TODO Auto-generated catch block
  92. e.printStackTrace();
  93. }
  94. m.start();        //播放
  95. }
  96. else if(v==btn_stop_audio || v==btn_stop_video)
  97. {
  98. m.stop();
  99. }
  100. else if(v==btn_start_video)
  101. {
  102. m.reset();//恢复到未初始化的状态
  103. m=MediaPlayer.create(testMedia.this, R.raw.test);//读取视频
  104. skb_video.setMax(m.getDuration());//设置SeekBar的长度
  105. m.setAudioStreamType(AudioManager.STREAM_MUSIC);
  106. m.setDisplay(surfaceHolder);//设置屏幕
  107. try {
  108. m.prepare();
  109. } catch (IllegalArgumentException e) {
  110. // TODO Auto-generated catch block
  111. e.printStackTrace();
  112. } catch (IllegalStateException e) {
  113. // TODO Auto-generated catch block
  114. e.printStackTrace();
  115. } catch (IOException e) {
  116. // TODO Auto-generated catch block
  117. e.printStackTrace();
  118. }
  119. m.start();
  120. }
  121. }
  122. }
  123. /*
  124. * SeekBar进度改变事件
  125. */
  126. class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{
  127. @Override
  128. public void onProgressChanged(SeekBar seekBar, int progress,
  129. boolean fromUser) {
  130. // TODO Auto-generated method stub
  131. }
  132. @Override
  133. public void onStartTrackingTouch(SeekBar seekBar) {
  134. isChanging=true;
  135. }
  136. @Override
  137. public void onStopTrackingTouch(SeekBar seekBar) {
  138. m.seekTo(seekBar.getProgress());
  139. isChanging=false;
  140. }
  141. }
  142. }

转载于:https://www.cnblogs.com/xiaochao1234/p/3934835.html

MediaPlayer开发全解析相关推荐

  1. iOS开发教程:Storyboard全解析-第二部分

    如果你想了解更多Storyboard的特性,那么你就来对了地方,下面我们就来接着上次的内容详细讲解Storyboard的使用方法. 在上一篇<iOS开发教程:Storyboard全解析-第一部分 ...

  2. 后端/服务端开发方向面试题全解析

    笔者在 2020 届秋招中斩获了京东.网易.去哪儿网等10余家互联网公司的校招 Offer.本 Chat 针对后端.服务端开发方向,分类的详细讲解后端服务端开发方向的面试题目,希望能够帮助到大家,在面 ...

  3. Java开发岗高频面试题全解析补充知识点(个人补充整理的知识点,非原文)

    第3章 Java核心技术 这里仅补充牛客专刊<Java开发岗高频面试题全解析>提到但是未展开讲解的知识点,个人收录向. 3.3.1 String.StringBuffer.StringBu ...

  4. 热度3年猛增20倍,Serverless云开发的技术架构全解析

    『 作为一个不断发展的新兴技术, Serverless 热度的制高点已然到来.』 或许,Google Trends 所显示的 3 年猛增 20 倍的" Serverless " 搜 ...

  5. 最全Linux驱动开发全流程详细解析(持续更新)

    Linux驱动开发详细解析 一.驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁. 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询.中断处理.DMA通信(CPU与外设通信 ...

  6. Go modules基础精进,六大核心概念全解析(下)

    Go 语言做开发时,路径是如何定义的?Go Mudules又为此带来了哪些改变?本文将会全面介绍Go Modules六大核心概念,包括了设计理念与兼容性原则等,掌握这些技术点对于管理和维护Go 模块有 ...

  7. 第四章:Spring项目文件上传两种方式(全解析)

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  8. jQuery Ajax 实例 全解析(转)

    jQuery Ajax 实例 全解析 jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我 ...

  9. js解析二维码_最新最全阿里巴巴,今日头条,腾讯Flutter面试真题全解析(狂虐不止)...

    阿里巴巴,今日头条,腾讯Flutter面试真题全解析.你只有去过大厂,才知道大厂的面试有多难,这个难度不是你能够想象得到的.所以说如果想去做这方面的工作,建议把以下内容好好准备一下(其实也就是多看一些 ...

最新文章

  1. python爬微博关键字_一个简单的python爬虫实践,爬取包含关键词的新浪微博
  2. Hibernate学习5—Hibernate操作对象
  3. 【Python】python3编码方式encode介绍
  4. 解题: SDOI 2011 染色
  5. 【华为云技术分享】华为云MySQL新增MDL锁视图特性,快速定位元数据锁问题
  6. GitHub 使用教程图文详解(转)
  7. 人工智能 深度学习(Deep learning)开源框架
  8. python visio_再见,Visio! - Python绿色通道的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 2019年8月9日 下午6:06:12 BD5613F5-0BE7-44DF-B231-CCC87
  10. 大数据背后的网络文学
  11. 一张程序员人生图,很有意思
  12. cpu性能测试软件 国际象棋,Fritz Chess Benchmark
  13. 网络安全专家教你设置史上最安全的WiFi密码
  14. 实至名归,凯联资本荣获融资中国第十一届资本年会多项荣誉
  15. Git如何查看本地已登录的用户账号及切换账号
  16. JAVA社招,让老板心动的简历原来是这样
  17. LAD-lasso和线性规划算法
  18. android qq分身,手机qq怎么分身
  19. hexo 博客小功能添加-评论、萌妹纸、相册、字数统计...
  20. 科普转载 CSS Pre-processors

热门文章

  1. Python相关机器学习‘武器库’
  2. 贝叶斯居然用事件概率,就轻松预知了未来?
  3. 头条丨2017年人工智能现七大走向
  4. 导航能力堪比GPS!动物们是这样做到的
  5. ARM与RISC-V之争,后起之秀的优势在哪儿?
  6. 未来全球15大热门研究方向出炉!
  7. 浅谈 EHT 黑洞照片拍摄原理
  8. 新一轮全球“太空竞赛”正上演 争夺几万亿美元大蛋糕
  9. CPU是如何制造出来的
  10. 3G网络关闭,4G还会远吗?