经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
一起学Android之音频视频
来源:cnblogs  作者:Alan.hsiang  时间:2019/7/15 8:37:50  对本文有异议

概述

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

涉及知识点

  1.  MediaPlayer 可以用来控制audio/video文件或流播放的类。通过此类,可以方便的控制音频/视频文件的播放,暂停和停止等操作。
  2. Uri 统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。
  3. VideoView 自带的一种播放视频的组件。
  4. SurfaceView 可以通过后台绘制显示的视图组件。 

Activity中播放音频

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

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

  1. 1 private MediaPlayer mMediaPlayer;
  2. 2
  3. 3 /**
  4. 4 * 开始
  5. 5 * @param v
  6. 6 */
  7. 7 public void bn_start(View v){
  8. 8 if(mMediaPlayer==null) {
  9. 9 ready();
  10. 10 }
  11. 11 mMediaPlayer.start();
  12. 12 }
  13. 13
  14. 14 /**
  15. 15 * 创建MediaPlayer并到prepare状态
  16. 16 */
  17. 17 private void ready(){
  18. 18 if(mMediaPlayer==null){
  19. 19 mMediaPlayer=new MediaPlayer();//Idle
  20. 20 //Log.i("TAG", "ready: "+filePath);
  21. 21 File file=new File(Environment.getExternalStorageDirectory(),"goldfallen.mp3");
  22. 22 Log.i("TAG", "ready: "+file.getPath());
  23. 23 Log.i("TAG", "ready: "+file.exists());
  24. 24 Uri uri= Uri.fromFile(file);
  25. 25 try {
  26. 26 mMediaPlayer.setDataSource(AudioActivity.this,uri);
  27. 27 mMediaPlayer.prepare();//Prepared
  28. 28 } catch (IOException e) {
  29. 29 Log.i("TAG", "ready: "+ e.getMessage());
  30. 30 e.printStackTrace();
  31. 31 }
  32. 32 }
  33. 33 }

2. 暂停播放

  1. 1 /**
  2. 2 * 暂停
  3. 3 * @param v
  4. 4 */
  5. 5 public void bn_pause(View v){
  6. 6 if(mMediaPlayer!=null && mMediaPlayer.isPlaying()){
  7. 7 mMediaPlayer.pause();
  8. 8 }
  9. 9 }

3. 停止

  1. 1 /**
  2. 2 * 停止
  3. 3 * @param v
  4. 4 */
  5. 5 public void bn_stop(View v){
  6. 6 if(mMediaPlayer!=null && mMediaPlayer.isPlaying()){
  7. 7 mMediaPlayer.stop();
  8. 8 mMediaPlayer.release();
  9. 9 mMediaPlayer=null;
  10. 10 }
  11. 11 }

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

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

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

  1. 1 /**
  2. 2 * D:\Android\Project\DemoMedia\app\src\main\res\raw\A2012.mp3:
  3. 3 * Error: 'A' is not a valid file-based resource name character:
  4. 4 * File-based resource names must contain only lowercase a-z, 0-9, or underscore
  5. 5 */
  6. 6 private void ready2(){
  7. 7 if(mMediaPlayer==null){
  8. 8 mMediaPlayer= MediaPlayer.create(this,R.raw.ab2012);
  9. 9 }
  10. 10 }

通过服务来播放音频

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

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

  1. 1 public class AudioService extends Service {
  2. 2
  3. 3 private MediaPlayer mMediaPlayer;
  4. 4
  5. 5 private OperatorReceiver mReceiver;
  6. 6
  7. 7 public AudioService() {
  8. 8 }
  9. 9
  10. 10 @Override
  11. 11 public void onCreate() {
  12. 12 super.onCreate();
  13. 13 mMediaPlayer=new MediaPlayer();
  14. 14 mReceiver=new OperatorReceiver();
  15. 15 IntentFilter filter=new IntentFilter("operator.receiver");
  16. 16 registerReceiver(mReceiver,filter);
  17. 17 }
  18. 18
  19. 19 @Override
  20. 20 public IBinder onBind(Intent intent) {
  21. 21 return null;
  22. 22 }
  23. 23
  24. 24 @Override
  25. 25 public int onStartCommand(Intent intent, int flags, int startId) {
  26. 26 Log.i("TAG", "onStartCommand: ----ready ");
  27. 27 ready();
  28. 28 return super.onStartCommand(intent, flags, startId);
  29. 29 }
  30. 30
  31. 31 @Override
  32. 32 public void onDestroy() {
  33. 33 if(mMediaPlayer!=null && mMediaPlayer.isPlaying()){
  34. 34 mMediaPlayer.stop();
  35. 35 }
  36. 36 if(mMediaPlayer!=null){
  37. 37 mMediaPlayer.release();
  38. 38 mMediaPlayer=null;
  39. 39 }
  40. 40 unregisterReceiver(mReceiver);
  41. 41 super.onDestroy();
  42. 42 }
  43. 43
  44. 44 private void start(){
  45. 45 mMediaPlayer.start();
  46. 46 }
  47. 47
  48. 48 private void pause(){
  49. 49 mMediaPlayer.pause();
  50. 50 }
  51. 51
  52. 52 private void stop(){
  53. 53 mMediaPlayer.stop();
  54. 54 ready();
  55. 55 }
  56. 56
  57. 57 private void ready(){
  58. 58 mMediaPlayer.reset();
  59. 59 try {
  60. 60 String filePath= Environment.getExternalStorageDirectory()+"/ab2012.mp3";
  61. 61 Log.i("TAG", "ready: "+filePath);
  62. 62 File file=new File(filePath);
  63. 63 if(file.exists()) {
  64. 64 mMediaPlayer.setDataSource(filePath);
  65. 65 mMediaPlayer.prepare();
  66. 66 }else{
  67. 67 Log.i("TAG", "ready: 文件不存在 ");
  68. 68 }
  69. 69 } catch (IOException e) {
  70. 70 Log.i("TAG", "ready: "+e.getMessage());
  71. 71 e.printStackTrace();
  72. 72 }
  73. 73 }
  74. 74 }

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

  1. 1 /**
  2. 2 * 操作接收器
  3. 3 */
  4. 4 class OperatorReceiver extends BroadcastReceiver
  5. 5 {
  6. 6 @Override
  7. 7 public void onReceive(Context context, Intent intent) {
  8. 8 int cmd=intent.getIntExtra("cmd",-1);
  9. 9 Log.i("TAG", "onReceive: "+cmd);
  10. 10 switch (cmd){
  11. 11 case Tools.PLAY:
  12. 12 start();
  13. 13 break;
  14. 14 case Tools.PAUSE:
  15. 15 pause();
  16. 16 break;
  17. 17 case Tools.STOP:
  18. 18 stop();
  19. 19 break;
  20. 20 default:
  21. 21 start();
  22. 22 break;
  23. 23
  24. 24 }
  25. 25 }
  26. 26 }

3. 启动服务

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

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

  1. 1 /**
  2. 2 * 开始
  3. 3 * @param v
  4. 4 */
  5. 5 public void bn_start(View v){
  6. 6 Intent intent=new Intent("operator.receiver");
  7. 7 intent.putExtra("cmd",Tools.PLAY);
  8. 8 sendBroadcast(intent);
  9. 9 Log.i("TAG", "bn_start: "+"service");
  10. 10 }
  11. 11
  12. 12 /**
  13. 13 * 暂停
  14. 14 * @param v
  15. 15 */
  16. 16 public void bn_pause(View v){
  17. 17 Intent intent=new Intent("operator.receiver");
  18. 18 intent.putExtra("cmd",Tools.PAUSE);
  19. 19 sendBroadcast(intent);
  20. 20 }
  21. 21
  22. 22 /**
  23. 23 * 停止
  24. 24 * @param v
  25. 25 */
  26. 26 public void bn_stop(View v){
  27. 27 Intent intent=new Intent("operator.receiver");
  28. 28 intent.putExtra("cmd",Tools.STOP);
  29. 29 sendBroadcast(intent);
  30. 30 }

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

  1. 1 <service
  2. 2 android:name=".AudioService"
  3. 3 android:enabled="true"
  4. 4 android:exported="true">
  5. 5 </service>

通过VideoView来播放视频

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

  1. 1 private VideoView mVideoView;
  2. 2 @Override
  3. 3 protected void onCreate(Bundle savedInstanceState) {
  4. 4 super.onCreate(savedInstanceState);
  5. 5 setContentView(R.layout.activity_video);
  6. 6 mVideoView= (VideoView) this.findViewById(R.id.vv_info);
  7. 7 //设置路径
  8. 8 File file=new File(Environment.getExternalStorageDirectory(),"DCIM/Camera/VID20190629142614.mp4");
  9. 9 Log.i("TAG", "onCreate: "+file.getPath());
  10. 10 if(!file.exists()){
  11. 11 Log.i("TAG", "onCreate: 文件不存在");
  12. 12 }
  13. 13 Uri uri=Uri.fromFile(file);
  14. 14 mVideoView.setVideoURI(uri);
  15. 15 //设置Media Controller
  16. 16 MediaController controller=new MediaController(this);
  17. 17 mVideoView.setMediaController(controller);
  18. 18 //获取焦点
  19. 19 mVideoView.requestFocus();
  20. 20 mVideoView.start();
  21. 21 //设置播放完成事件
  22. 22 mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  23. 23 @Override
  24. 24 public void onCompletion(MediaPlayer mp) {
  25. 25 Toast.makeText(VideoActivity.this, "播放完毕", Toast.LENGTH_SHORT).show();
  26. 26 }
  27. 27 });
  28. 28 }

通过MediaPlayer来播放视频

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

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

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

2. 暂停与停止

  1. 1 public void bn_pause(View view){
  2. 2 if(mMediaPlayer.isPlaying()){
  3. 3 mMediaPlayer.pause();
  4. 4 }
  5. 5 }
  6. 6
  7. 7 public void bn_stop(View view){
  8. 8 if(mMediaPlayer.isPlaying()){
  9. 9 mMediaPlayer.stop();
  10. 10 }
  11. 11 }

3. 资源释放

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

权限设置

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

  1. 1 <uses-permission android:name="android.permission.INTERNET"/>
  2. 2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  3. 3 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  4. 4 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

备注

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

 

原文链接:http://www.cnblogs.com/hsiang/p/11181673.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号