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