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

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

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

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

  1 package com.example.tools;  2   3 import android.content.Context;  4 import android.media.MediaPlayer;  5 import android.media.MediaRecorder;  6 import android.os.Environment;  7 import android.view.SurfaceHolder;  8 import android.view.SurfaceView;  9  10 /* 11  * Android录音辅助类  12  * 需要添加的权限: 13  * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   14  * <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>   15  * <uses-permission android:name="android.permission.RECORD_AUDIO" />  16  * 视频录制添加的权限: 17  * <uses-permission android:name="android.permission.CAMERA" />   18  * <uses-permission android:name="android.permission.RECORD_AUDIO" />   19  * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  20  * 文件格式:Environment.getExternalStorageDirectory().getAbsolutePath() + "/TonFun.amr" 21  */ 22 public class SoundRecordingHelper implements SurfaceHolder.Callback { 23     // 文件路径 24     private String strFilePath = ""; 25     // 数据上下文 26     private Context context = null; 27     // 媒体播放对象 28     private MediaPlayer mPlayer = null; 29     // 媒体录音对象 30     private MediaRecorder mRecorder = null; 31     // 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看 32     // 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口 33     private SurfaceHolder surfaceHolder; 34  35     public String getStrFilePath() { 36         return strFilePath; 37     } 38  39     public void setStrFilePath(String strFilePath) { 40         this.strFilePath = strFilePath; 41     } 42  43     /* 44      * 音频录制的构造函数 45      */ 46     public SoundRecordingHelper(Context context, String strFilePath) { 47         this.context = context; 48         this.strFilePath = strFilePath; 49     } 50  51     /* 52      * 视频录制的构造函数 53      */ 54     @SuppressWarnings("deprecation") 55     public SoundRecordingHelper(Context context, SurfaceView surfaceview, 56             String strFilePath) { 57         this.context = context; 58         this.surfaceHolder = surfaceview.getHolder(); 59         this.surfaceHolder.addCallback(this); // 加入回调接口 60         this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 这个方法已经过时了,但是为了兼容低版本必须设置 61         this.strFilePath = strFilePath; 62     } 63  64     /* 65      * 开始录音 66      */ 67     public boolean startSoundRecording() { 68         boolean bResult = false; 69         mRecorder = new MediaRecorder(); 70         mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频来源(MIC表示麦克风) 71         mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 设置音频输出格式 72         mRecorder.setOutputFile(strFilePath); 73         mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 设置音频编码 74         try { 75             mRecorder.prepare(); 76             mRecorder.start(); 77             bResult = true; 78         } catch (Exception ex) { 79             System.out.println("Error:录音失败、" + ex.getMessage()); 80             bResult = false; 81         } 82         return bResult; 83     } 84  85     /* 86      * 停止录音 87      */ 88     public boolean stopSoundRecording() { 89         boolean bResult = false; 90         if (mRecorder != null) { 91             mRecorder.stop(); 92             mRecorder.release(); 93             mRecorder = null; 94             bResult = true; 95         } else { 96             bResult = false; 97         } 98         return bResult; 99     }100 101     /*102      * 开始播放音频103      */104     public boolean startPlay() {105         boolean bResult = false;106         mPlayer = new MediaPlayer();107         try {108             mPlayer.setDataSource(strFilePath);109             mPlayer.prepare();110             mPlayer.start();111             bResult = true;112         } catch (Exception ex) {113             System.out.println("Error:播放失败、" + ex.getMessage());114             bResult = false;115         }116         return bResult;117     }118 119     /*120      * 停止播放音频121      */122     public boolean stopPlay() {123         boolean bResult = false;124         if (mPlayer != null) {125             mPlayer.stop();126             mPlayer.release();127             mPlayer = null;128             bResult = true;129         } else {130             bResult = false;131         }132         return bResult;133     }134 135     /*136      * 调用摄像头进行视频录制 nWidth:视频的宽137      * nHeight:视频的高nRate:视频帧数nType:视频格式(MediaRecorder.OutputFormat.THREE_GPP)138      */139     public boolean startVideoRecording(int nWidth, int nHeight, int nRate,140             int nType) {141         boolean bResult = false;142         mRecorder = new MediaRecorder();143         mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置视频源为摄像头144         mRecorder.setOutputFormat(nType);// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4145         mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); // 设置录制的视频编码h263146                                                                     // h264147         mRecorder.setVideoSize(nWidth, nHeight);// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错148         mRecorder.setVideoFrameRate(nRate);// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错149         mRecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 设置显示预览150         mRecorder.setOutputFile(strFilePath); // 设置输出路径151         try {152             mRecorder.prepare();153             mRecorder.start();154             bResult = true;155         } catch (Exception ex) {156             System.out.print("Error:视频录制错误、" + ex.getMessage());157             bResult = false;158         }159         return bResult;160     }161 162     /*163      * 停止视频录制164      */165     public boolean stopVideoRecording() {166         boolean bResult = false;167         if (mRecorder != null) {168             mRecorder.stop();169             mRecorder.release();170             mRecorder = null;171             bResult = true;172         } else {173             bResult = false;174         }175         return bResult;176     }177 178     /*179      * SurfaceHolder.Callback接口实现方法180      */181     @Override182     public void surfaceChanged(SurfaceHolder holder, int format, int width,183             int height) {184         // TODO Auto-generated method stub185         System.out.println(holder.toString());186     }187 188     @Override189     public void surfaceCreated(SurfaceHolder holder) {190         // TODO Auto-generated method stub191         System.out.println(holder.toString());192     }193 194     @Override195     public void surfaceDestroyed(SurfaceHolder holder) {196         // TODO Auto-generated method stub197         if (context != null) {198             context = null;199         }200         if (mPlayer != null) {201             mPlayer = null;202         }203         if (mRecorder != null) {204             mRecorder = null;205         }206     }207 }


注:实现视频录制时需要在UI布局中添加Surfaceview控件,用以实时预览视频。如分辨率过低是会导致视频花屏!如有错误请指出、以免误导他人!

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

更多相关文章

  1. Android的Window类
  2. 玩转Android---UI篇---TextView(文本框)
  3. Android学习笔记(11)---关于布局的一些小事
  4. Android(安卓)移动终端camera 防偷*拍设置
  5. Android(安卓)EditText输入光标居于开头最开始位置
  6. [Android]解决EditText设置成密码模式改变提示字体的问题
  7. Android(安卓)新手扫盲
  8. Android布局中的常用属性小结
  9. 玩转Android---UI篇---TextView(文本框)

随机推荐

  1. android 调色板小练习
  2. android上的http
  3. Android中Activity启动模式详解
  4. 帮同事找到了一个问题的解决办法:在androi
  5. Android(安卓)自定义实现TextView单行超
  6. Android中的几种网络请求方式详解
  7. 在android中显示网络图片及查看页面源代
  8. java android客户端SSL通信 遇到的几个报
  9. android 常见分辨率(mdpi、hdpi 、xhdpi、
  10. Android字体加粗