智能手机操作系统IOS与Android平分天下(PS:WP与其他的直接无视了),而Android的免费招来了一大堆厂商分分向Android示好,故Android可能会有“较好”的前景。

Android实现简单的录音、播音与视频录制功能。当然了、无论是出场绑定的还是第三方都有很多很好的应用。但是对于一名开发人员来说及时做的UI再丑、功能再烂那也是一种成就!

实现录音、录制视频功能需要调用【MediaRecorder】类,播放音频则需要【MediaPlayer】类。那简单以实现录音、录制视频、播放音频为例写一个自己的SoundRecordingHelper类。

思路:Android已经封装好了这两个类只需要进行简单的设置就可以实现这三个功能了
    1、需要在工程文件中添加需要的权限
    2、设置布局文件
    3、调用自己封装的SoundRecordingHelper类。下面主要讲SoundRecordingHelper类,实现功能直接调用此类中的Start与Stop方法即可。

 package com.example.tools;

 import android.content.Context;
 import android.media.MediaPlayer;
 import android.media.MediaRecorder;
 import android.os.Environment;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;

 /*
  * Android录音辅助类
  * 需要添加的权限:
  * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  * <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  * <uses-permission android:name="android.permission.RECORD_AUDIO" />
  * 视频录制添加的权限:
  * <uses-permission android:name="android.permission.CAMERA" />
  * <uses-permission android:name="android.permission.RECORD_AUDIO" />
  * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  * 文件格式:Environment.getExternalStorageDirectory().getAbsolutePath() + "/TonFun.amr"
  */
 public class SoundRecordingHelper implements SurfaceHolder.Callback {
     // 文件路径
     private String strFilePath = "";
     // 数据上下文
     private Context context = null;
     // 媒体播放对象
     private MediaPlayer mPlayer = null;
     // 媒体录音对象
     private MediaRecorder mRecorder = null;
     // 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看
     // 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口
     private SurfaceHolder surfaceHolder;

     public String getStrFilePath() {
         return strFilePath;
     }

     public void setStrFilePath(String strFilePath) {
         this.strFilePath = strFilePath;
     }

     /*
      * 音频录制的构造函数
      */
     public SoundRecordingHelper(Context context, String strFilePath) {
         this.context = context;
         this.strFilePath = strFilePath;
     }

     /*
      * 视频录制的构造函数
      */
     @SuppressWarnings("deprecation")
     public SoundRecordingHelper(Context context, SurfaceView surfaceview,
             String strFilePath) {
         this.context = context;
         this.surfaceHolder = surfaceview.getHolder();
         this.surfaceHolder.addCallback(this); // 加入回调接口
         this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 这个方法已经过时了,但是为了兼容低版本必须设置
         this.strFilePath = strFilePath;
     }

     /*
      * 开始录音
      */
     public boolean startSoundRecording() {
         boolean bResult = false;
         mRecorder = new MediaRecorder();
         mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频来源(MIC表示麦克风)
         mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 设置音频输出格式
         mRecorder.setOutputFile(strFilePath);
         mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 设置音频编码
         try {
             mRecorder.prepare();
             mRecorder.start();
             bResult = true;
         } catch (Exception ex) {
             System.out.println("Error:录音失败、" + ex.getMessage());
             bResult = false;
         }
         return bResult;
     }

     /*
      * 停止录音
      */
     public boolean stopSoundRecording() {
         boolean bResult = false;
         if (mRecorder != null) {
             mRecorder.stop();
             mRecorder.release();
             mRecorder = null;
             bResult = true;
         } else {
             bResult = false;
         }
         return bResult;
     }

     /*
      * 开始播放音频
      */
     public boolean startPlay() {
         boolean bResult = false;
         mPlayer = new MediaPlayer();
         try {
             mPlayer.setDataSource(strFilePath);
             mPlayer.prepare();
             mPlayer.start();
             bResult = true;
         } catch (Exception ex) {
             System.out.println("Error:播放失败、" + ex.getMessage());
             bResult = false;
         }
         return bResult;
     }

     /*
      * 停止播放音频
      */
     public boolean stopPlay() {
         boolean bResult = false;
         if (mPlayer != null) {
             mPlayer.stop();
             mPlayer.release();
             mPlayer = null;
             bResult = true;
         } else {
             bResult = false;
         }
         return bResult;
     }

     /*
      * 调用摄像头进行视频录制 nWidth:视频的宽
      * nHeight:视频的高nRate:视频帧数nType:视频格式(MediaRecorder.OutputFormat.THREE_GPP)
      */
     public boolean startVideoRecording(int nWidth, int nHeight, int nRate,
             int nType) {
         boolean bResult = false;
         mRecorder = new MediaRecorder();
         mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置视频源为摄像头
         mRecorder.setOutputFormat(nType);// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
         mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); // 设置录制的视频编码h263
                                                                     // h264
         mRecorder.setVideoSize(nWidth, nHeight);// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
         mRecorder.setVideoFrameRate(nRate);// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
         mRecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 设置显示预览
         mRecorder.setOutputFile(strFilePath); // 设置输出路径
         try {
             mRecorder.prepare();
             mRecorder.start();
             bResult = true;
         } catch (Exception ex) {
             System.out.print("Error:视频录制错误、" + ex.getMessage());
             bResult = false;
         }
         return bResult;
     }

     /*
      * 停止视频录制
      */
     public boolean stopVideoRecording() {
         boolean bResult = false;
         if (mRecorder != null) {
             mRecorder.stop();
             mRecorder.release();
             mRecorder = null;
             bResult = true;
         } else {
             bResult = false;
         }
         return bResult;
     }

     /*
      * SurfaceHolder.Callback接口实现方法
      */
     @Override
     public void surfaceChanged(SurfaceHolder holder, int format, int width,
             int height) {
         // TODO Auto-generated method stub
         System.out.println(holder.toString());
     }

     @Override
     public void surfaceCreated(SurfaceHolder holder) {
         // TODO Auto-generated method stub
         System.out.println(holder.toString());
     }

     @Override
     public void surfaceDestroyed(SurfaceHolder holder) {
         // TODO Auto-generated method stub
         if (context != null) {
             context = null;
         }
         if (mPlayer != null) {
             mPlayer = null;
         }
         if (mRecorder != null) {
             mRecorder = null;
         }
     }
 }
注:实现视频录制时需要在UI布局中添加 Surfaceview控件,用以实时预览视频。如分辨率过低是会导致视频花屏!如有错误请指出、以免误导他人!

下载地址:http://www.msdn.top/documents/android/VideoRecordingDemo.zip

【Android】 Android实现录音、播音、录制视频功能的更多相关文章

  1. Android ADB工具-截图和录制视频(五)

    Android ADB工具-截图和录制视频(五) 标签(空格分隔): Android ADB 7. 截图和录制视 命令 功能 adb shell screencap –p <path/file& ...

  2. javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  3. Android使用的开发MediaRecorder录制视频

    MediaRecorder除了使用录制音频.还可用于录制视频.关于MediaRecorder的具体解释大家能够參考<Android开发之MediaRecorder类具体解释>.使用Medi ...

  4. Android开发之打开闪光灯录制视频

    Android的SDK在线API上对录制视频的方法.步骤都写得非常清楚,但是如果没有一点思路,写起来也比较式费事.录制视频的全过程要打开闪光灯(可能是因为项目需要,或者特殊原因),则必须按照一定的顺序 ...

  5. [PPT] PPT 录制视频功能.

    1. 需要PPT 里面增加进截图, 发现还不如 直接插入视频合理 本来想了一种方式是 使用 screen to gif 的工具 生成gif 来处理. 后来 发现ppt 里面自带一个 屏幕录制功能. 2 ...

  6. Android WebView 实现文件选择、拍照、录制视频、录音

    原文地址:Android WebView 实现文件选择.拍照.录制视频.录音 | Stars-One的杂货小窝 Android中的WebView如果不进行相应的设置,H5页面的上传按钮是无法触发And ...

  7. Android拍照,录制视频,相机简单功能实现

    1.效果图,功能没有录制出来. 基本实现了拍照,录制视频,前后摄像头切换的功能,可以转屏,聚焦. 代码在最下面,可以看代码,运行apk看实际效果. 2.权限不能忘 <uses-permissio ...

  8. 使用Android编写录制视频小程序演示样例

    主要实现录制功能的类:Camera类和MediaRecorder类.功能描写叙述:首先进入视频录制界面,点击录像button进入录像功能界面,点击录制開始录制视频, 点击停止button,将录制的视频 ...

  9. 转:android 录制视频的Demo

    转:http://blog.csdn.net/peijiangping1989/article/details/7049991 在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. ...

随机推荐

  1. 【推荐】iOS集合视图的可重新排序的layout

    在实际项目中你或许会遇到在一个集合视图中移动一项到另外一个位置,那么此时我们需要对视图中的元素进行重新排序,今天推荐一个很好用的第三方类LXReorderableCollectionViewFlowL ...

  2. JS 生成26个大小写字母

    主要用到 str.charCodeAt()和 String.fromCharCode()方法 -->使用 charCodeAt() 来获得字符串中某个具体字符的 Unicode 编码. --&g ...

  3. [C/C++][文件操作] 对比目录并列出同名较新文件、较旧文件 0.1

    主要是模仿robocopy的部分功能 (robocopy /L 参数可以列出本地目录和备份目录中的异同之处,主要是标记出:较新的.较旧的.多出的文件 ) 现在还不会写GUI,打算后面自己做目录树dif ...

  4. Azure开发者任务之六:使用WCF Service Web Role

    在本文中,我们将会在local development fabric上创建一个WCF服务角色,然后在一个控制台应用程序中使用它. WCF服务角色可以让我们创建一个WCF服务,并且把它托管在Window ...

  5. linux2.4.18内核定时器的使用

    Linux2.4下驱动中定时器的应用 我的内核是2.4.18的.Linux的内核中定义了一个定时器的结构: #include<linux/timer.h> struct timer_lis ...

  6. ACdream 1214---矩阵连乘

    ACdream 1214---矩阵连乘 Problem Description You might have noticed that there is the new fashion among r ...

  7. KMP--Cyclic Nacklace

    题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110060#problem/D Description CC always be ...

  8. 利用多写Redis实现分布式锁原理与实现分析(转)

    利用多写Redis实现分布式锁原理与实现分析   一.关于分布式锁 关于分布式锁,可能绝大部分人都会或多或少涉及到. 我举二个例子:场景一:从前端界面发起一笔支付请求,如果前端没有做防重处理,那么可能 ...

  9. JavaScript基础14——js的Math对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. MSCRM 2011/2013 单点登录 实现

    通过自定义的ASP.NET程序,输入相关信息后,直接进入MSCRM 2011/2013中.