智能手机操作系统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. Qt之自定义QLineEdit右键菜单

    一.QLineEdit说明 QLineEdit是单行文本框,不同于QTextEdit,他只能显示一行文本,通常可以用作用户名.密码和搜索框等.它还提供了一些列的信号和槽,方便我们使用,有兴趣的小伙伴可 ...

  2. 通过Nginx实现负载均衡

    百度了下负载均衡:英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务 嗯,跟我理 ...

  3. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

  4. 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性

    [索引页][源码下载] 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性 作者:weba ...

  5. win32程序启用控制台

    #include <cstdio> #define USE_WIN32_CONSOLE int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _I ...

  6. android 学习资料

    Fragment 事件分发机制 事件分发机制2 NDK JNI ndk { moduleName "mymodule" ldLibs "log" stl &qu ...

  7. wrong requestcode when using startActivityForResult

    You are calling startActivityForResult() from your Fragment. When you do this, the requestCode is ch ...

  8. 【图解】Eclipse下JRebel6.2.0热部署插件安装、破解及配置【转】

    标签: 这两天在做后台管理系统,前端框架用Bootstrap,后端用SpringMVC+Velocity.在开发过程中,经常需要对界面进行微调,调整传参等,每次更改一次java代码,就得重新部署一次, ...

  9. (旧)子数涵数·Flash——影片剪辑的事件操作

    一.综述 1.概念:影片剪辑的事件操作,就是onClipEvent命令,就如同在按钮上使用的on命令. 2.方法:onClipEnvent(参数){命令} 3.参数:onClipEnvent有许多的参 ...

  10. phpcms--使用添加php原生支持

    1,phpcms模板中有时候要添加一些php相关变量这个时候要使用原始php的东西,可以如下加入 {php $no_wq_id=$r[id] ;}其中$r[id]是通过{pc:get sql=&quo ...