《程序人生 —— Android实现录音、播音、录制视频功能》

智能手机操作系统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为mp4

145         mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); // 设置录制的视频编码h263

146                                                                     // h264

147         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     @Override

182     public void surfaceChanged(SurfaceHolder holder, int format, int width,

183             int height) {

184         // TODO Auto-generated method stub

185         System.out.println(holder.toString());

186     }

187 

188     @Override

189     public void surfaceCreated(SurfaceHolder holder) {

190         // TODO Auto-generated method stub

191         System.out.println(holder.toString());

192     }

193 

194     @Override

195     public void surfaceDestroyed(SurfaceHolder holder) {

196         // TODO Auto-generated method stub

197         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

你可能感兴趣的:(android)