一起学Android之音频视频

概述

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

涉及知识点

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

Activity中播放音频

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

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

 1 private MediaPlayer mMediaPlayer;
 2
 3     /**
 4      * 开始
 5      * @param v
 6      */
 7     public void bn_start(View v){
 8         if(mMediaPlayer==null) {
 9             ready();
10         }
11         mMediaPlayer.start();
12     }
13
14  /**
15      * 创建MediaPlayer并到prepare状态
16      */
17     private void ready(){
18         if(mMediaPlayer==null){
19             mMediaPlayer=new MediaPlayer();//Idle
20             //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      * @param v
4      */
5     public void bn_pause(View v){
6         if(mMediaPlayer!=null && mMediaPlayer.isPlaying()){
7             mMediaPlayer.pause();
8         }
9     }

3. 停止

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

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

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

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

 1 /**
 2      * D:\Android\Project\DemoMedia\app\src\main\res\raw\A2012.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 underscore
 5      */
 6     private void ready2(){
 7         if(mMediaPlayer==null){
 8             mMediaPlayer= MediaPlayer.create(this,R.raw.ab2012);
 9         }
10     }

通过服务来播放音频

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

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

 1 public class AudioService extends Service {
 2
 3     private MediaPlayer mMediaPlayer;
 4
 5     private OperatorReceiver mReceiver;
 6
 7     public AudioService() {
 8     }
 9
10     @Override
11     public void onCreate() {
12         super.onCreate();
13         mMediaPlayer=new MediaPlayer();
14         mReceiver=new OperatorReceiver();
15         IntentFilter filter=new IntentFilter("operator.receiver");
16         registerReceiver(mReceiver,filter);
17     }
18
19     @Override
20     public IBinder onBind(Intent intent) {
21         return null;
22     }
23
24     @Override
25     public int onStartCommand(Intent intent, int flags, int startId) {
26         Log.i("TAG", "onStartCommand: ----ready ");
27         ready();
28         return super.onStartCommand(intent, flags, startId);
29     }
30
31     @Override
32     public void onDestroy() {
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 void start(){
45         mMediaPlayer.start();
46     }
47
48     private  void pause(){
49         mMediaPlayer.pause();
50     }
51
52     private void stop(){
53         mMediaPlayer.stop();
54         ready();
55     }
56
57     private void ready(){
58         mMediaPlayer.reset();
59         try {
60             String filePath= Environment.getExternalStorageDirectory()+"/ab2012.mp3";
61             Log.i("TAG", "ready: "+filePath);
62             File file=new File(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 extends BroadcastReceiver
 5     {
 6         @Override
 7         public void onReceive(Context context, Intent intent) {
 8             int cmd=intent.getIntExtra("cmd",-1);
 9             Log.i("TAG", "onReceive: "+cmd);
10             switch (cmd){
11                 case Tools.PLAY:
12                     start();
13                     break;
14                 case Tools.PAUSE:
15                     pause();
16                     break;
17                 case Tools.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      * @param v
 4      */
 5     public void bn_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      * @param v
15      */
16     public void bn_pause(View v){
17         Intent intent=new Intent("operator.receiver");
18         intent.putExtra("cmd",Tools.PAUSE);
19         sendBroadcast(intent);
20     }
21
22     /**
23      * 停止
24      * @param v
25      */
26     public void bn_stop(View v){
27         Intent intent=new Intent("operator.receiver");
28         intent.putExtra("cmd",Tools.STOP);
29         sendBroadcast(intent);
30     }

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

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

通过VideoView来播放视频

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

 1  private VideoView mVideoView;
 2     @Override
 3     protected void onCreate(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(new MediaPlayer.OnCompletionListener() {
23             @Override
24             public void onCompletion(MediaPlayer mp) {
25                 Toast.makeText(VideoActivity.this, "播放完毕", Toast.LENGTH_SHORT).show();
26             }
27         });
28     }

通过MediaPlayer来播放视频

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

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

 1 public  void bn_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  void bn_pause(View view){
 2         if(mMediaPlayer.isPlaying()){
 3             mMediaPlayer.pause();
 4         }
 5     }
 6
 7     public  void bn_stop(View view){
 8         if(mMediaPlayer.isPlaying()){
 9             mMediaPlayer.stop();
10         }
11     }

3. 资源释放

 1  @Override
 2     protected void onDestroy() {
 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     <uses-permission android:name="android.permission.INTERNET"/>
2     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
4     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

备注

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

原文地址:https://www.cnblogs.com/hsiang/p/11181673.html

时间: 2024-07-30 10:29:03

一起学Android之音频视频的相关文章

Android 打开/播放电脑的音频/视频文件

今天早上一到办公室,照常打开博客园看文章,看到有一片文章是用  http://www.cnblogs.com/wdfrog/p/3738180.html 看到这哥们实现的方法好复杂,又是配置电脑端,又是配置手机端,还又是转码啥的,倒腾时间长不说,而且还很麻烦,这里介绍下我是如何用手机直接播放电脑上的文件的. 之所以播放电脑上的文件,主要原因是视频文件都很大,清晰度高的一部电影都1GB左右了,对于手机来说,虽然能够装得下,但是看完就得删了,没法长时间储存在手机上, 来回往手机上拷视频文件,就这文件

【视频】零基础学Android开发:蓝牙聊天室APP(一)

零基础学Android开发:蓝牙聊天室APP第一讲 1. Android介绍与环境搭建:史上最高效Android入门学习 1.1 Google的大小战略 1.2 物联网与云计算 1.3 智能XX设备 1.4 Android发展前景 1.5 Android企业需求与就业薪资 1.6 Android框架介绍 1.7 搭建Android开发环境 1.8 Android SDK文件夹具体解释 1.9 开发第一个App:HelloWorld 1.10 App应用程序文件夹具体解释 在线收看:http://

【视频】零基础学Android开发:蓝牙聊天室APP(三)

零基础学Android开发:蓝牙聊天室APP第三讲 3.1 ImageView.ImageButton控件详解 3.2 GridView控件详解 3.3 SimpleAdapter适配器详解 3.4 事件监听器:OnItemClickListener 3.5 输入和显示表情图像 在线收看:http://www.3g-edu.org/news/video023.htm 视频下载:http://pan.baidu.com/s/1kTmiNqf

【视频】零基础学Android开发:蓝牙聊天室APP(四)

零基础学Android开发:蓝牙聊天室APP第四讲 4.1 ListView控件的使用 4.2 BaseAdapter详解 4.3 ListView分布与滚动事件 4.4 ListView事件监听器:OnItemClickedListener 在线收看:http://www.3g-edu.org/news/video026.htm 视频下载:http://pan.baidu.com/s/1jGkjDGE

【视频】零基础学Android开发:蓝牙聊天室APP(二)

零基础学Android开发:蓝牙聊天室APP第二讲 2.1 课程内容应用场景 2.2 Android UI设计 2.3 组件布局:LinearLayout和RelativeLayout 2.4 TextView.EditText.Button控件 2.5 文本信息的隐藏和显示 2.6 输入和显示表情图像 在线收看:http://www.3g-edu.org/news/video022.htm 视频下载:http://pan.baidu.com/s/1mgHoObu

android基础----&gt;音频和视频的使用

Android 在播放音频和视频方面也是做了相当不错的支持,它提供了一套较为完整的API,使得开发者可以很轻松地编写出一个简易的音频或视频播放器.今天我们开始android中音频和视频使用的学习. 目录导航 音频的播放 视频的播放 友情链接 音频的播放 项目结构如下:一个简单的读取sd卡上的音频或者视频资源的应用 在Android 中播放音频文件一般都是使用MediaPlayer 类来实现的,它对多种格式的音频文件提供了非常全面的控制方法,从而使得播放音乐的工作变得十分简单. 一. 初始化音频的

基于 Android 的 3D 视频样本代码

作者:Mark Liu 下载样本代码 简介 在Android 中,创建一个能够播放视频剪辑的应用非常简单:创建一个采用 3D 图形平面的游戏应用也非常简单.但是,创建一个能够在 3D 图形对象上播放视频的应用却不容易.本文介绍了我为应对该挑战创建的应用.该应用可在 3D 平面上渲染视频,并支持用户以交互的方式在视频平面上播放. 该应用需要解决三大实施问题: 如何构建代码以支持用户在播放视频时变更 3D 平面? 虽然 Android 中默认的 MediaPlayer 配备了全面的播放操作,但是难以

android平台短视频技术之 视频编辑的经验分享.

提示一: 各位看官,这里分享的是视频编辑,即剪切/拼接/分离/合并/涂鸦/标记/叠加/滤镜等对视频的编辑操作.不是流媒体网络播放等功能,请注意. 提示二: 这些文字90%的为普及知识,10%为宣传我们的SDK,因为分享别人,有利自已,才是良性循环,才可以让我们持续分享,毕竟只分享,不有益很难持续下去.要养家糊口啊^_^. 提示三:我们是android视频编辑的专业团队,以下分享的文字,完全实际经验总结,每一个知识点您都可以在我们的SDK或开源的工程中验证.我们的SDK:https://githu

学Android开发 这19个开发工具助你顺风顺水

学Android开发 这19个开发工具助你顺风顺水 要想快速开发一个Android应用,通常会用到很多工具,巧妙利用这些工具,能让我们的开发工作事半功倍,节省大量时间,下面大连Android开发培训小编就为大家介绍下这19个开发工具都有神马用途. 1.XAppDbg XAppDbg是一个可以在运行中改变代码中参数的一个应用开发工具.这个工具可以为你省下大量的时间,因为你不用为应用的每次小改变而重新编译运行你的程序. 2.ChkBugReport 这个工具可以快速地检查输出的Android错误报告