智能手机操作系统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. [Code] C#与js的正则表达式

    元字符: 单个字符: . [] 限定符: * + ? {n} {n,} {n,m} 头尾: ^ $' 其他: | () 正则表达式在js和C#中都有. C#中: 创建: var regex = new ...

  2. Spring总结—— IOC 和 Bean 的总结

    一.Spring 官方文档中给出的 Spring 的整体结构. 二.我自己所理解的 Spring 整体结构图. 三.本次总结 Spring 核心部分 1.从上面图中可以看出,Beans 和 Conte ...

  3. dp --- CSU 1547: Rectangle

    Rectangle Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1547 Mean: 给你一些宽为1或2 的木 ...

  4. 甲骨文白桃花心木P6 EPPM 8.2项目点提供样本

    甲骨文白桃花心木样例代码 除非明确确定,这里的示例代码不是认证或Oracle支持;它只是用于教育或测试的目的. 你必须接受 许可协议下载此示例代码.  接受 许可协议 |  下降 许可协议   的名字 ...

  5. 【原创】有关Silverlight控件DataGrid的绑定数据后单元格单独复制的功能实现分析

    前些日子,公司新需求需要对silverlight的datagrid进行局部任意单元格数据可复制,查阅了半天网络资料愣是没找到相关资料,开始还以为是silverlight的bug根部无法实现, 最后还是 ...

  6. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

  7. php中的引用类型和值类型

    PHP中的四种简单类型和复杂类型array都是值类型.同类型间赋值传递的是值,即创建一个副本给新变量. 例如: $int1 = 123; $int2 = $int1;//直接传递的是值,只是做了一个叫 ...

  8. 记录php日志

    1.记录PHP错误日志 display_errors与log_errors的区别 display_errors 错误回显,一般常用于开发模式,但是很多应用在正式环境中也忘记了关闭此选项.错误回显可以暴 ...

  9. .net经验积累

    希望对.net编程者有所帮助 1.学会配置环境变量  1.我的电脑-属性-环境变量-双击下面的path-粘贴路径  2.ctrl+r 输入软件名字按回车 2.常用vs2010快捷键  代码格式化:ct ...

  10. java微信开发(wechat4j)——支持微信JS-SDK的jsapi_ticket中控服务器

    jsapi_ticket是使用js-sdk必须要的一个凭证,需要配置在js中. jsapi_ticket获取 要获取jsapi_ticket可以使用如下的方法 String jsapi_ticket ...