智能手机操作系统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. php + Redis 写的类似于新浪微博的feed系统

    最近接了一个feed系统的外包,类似于微博那种!客户端是ios和android,服务器用的php,数据库用的是redis.分享下服务器和数据库部分的功能!希望对大家有帮助. 关于redis的介绍,大家 ...

  2. SQL Server技术问题之视图优缺点

    优点: 一.简单性.视图不仅可以简化用户对数据的理解,也可以简化他们的操作.那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件. 二.安全性.通过视图用户只能查询和修 ...

  3. C#入门经典第五版之变量的更多内容编码题训练

    1. 编写一个控制台应用程序,它接收用户输入的一个字符串,将其中的字符以与输入相反的顺序输出. public string ReverseString(string str) { string rev ...

  4. Team Foundation Server简介

    对于任何一个软件开发团队而言,成功的一个重要因素在于成员之间.成员与首先使用软件的用户之间有很好的沟通. Team Foundation Server是一个独立的服务器产品,逻辑上,由下列两层组成,这 ...

  5. P6 EPPM 16 R1 文档和帮助系统

    P6 EPPM 16 R1 文档和帮助系统 https://docs.oracle.com/cd/E74894_01/ http://docs.oracle.com/cd/E68202_01/clie ...

  6. win 10 远程连接出现 "由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后.” 错误

    win 10 远程连接出现 "由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后.” 错误 解决方法如下: Step 1:打开"本地安全策略"- Wi ...

  7. sql:MySQL 6.7 表,视图,存储过程结构查询

    #数据库MySQL 6.7 use sakila; #查询表名 show tables; # SELECT TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA. ...

  8. 译 PrestaShop开发者指南 第四篇 深入PrestaShop核心开发

    ## 访问数据库 ### 数据库结构 PrestaShop的数据库表默认带有ps_的前缀,前缀在安装时可以自定义. 所有表名都是小写,以下划线分割.当一个表表示要在两个实体间建立连接时,表名中两个实体 ...

  9. 【CODEVS 3287】【NOIP2013】火车运输

    http://codevs.cn/problem/3287/ 题目描述 国有 座城市,编号从 到 ,城市之间有 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 辆货车在运输货物, 司机们想 ...

  10. Python数学运算的一个小算法(求一元二次方程的实根)

    请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² + bx + c = 0的两个解. #!/usr/bin/env python # -*- coding: ...