AndroidÒôÊÓÆµÖ®MediaRecorderÒôÊÓÆµÂ¼ÖÆ ÏÂÔØ±¾ÎÄ

AndroidÒôÊÓÆµÖ®MediaRecorderÒôÊÓÆµÂ¼ÖÆ Ð§¹ûͼ:

MediaRecorderÀà½éÉÜ£º

MediaRecorderÀàÊÇAndroid sdkÌṩµÄÒ»¸öרÃÅÓÃÓÚÒôÊÓÆµÂ¼ÖÆ£¬Ò»°ãÀûÓÃÊÖ»úÂó¿Ë·ç²É¼¯ÒôƵ£¬ÉãÏñÍ·²É¼¯Í¼Æ¬ÐÅÏ¢¡£

MediaRecorderÖ÷Òªº¯Êý£º

setAudioChannels(int numChannels) ÉèÖÃÂ¼ÖÆµÄÒôƵͨµÀÊý setAudioEncoder(int audio_encoder) ÉèÖÃaudioµÄ±àÂë¸ñʽ setAudioEncodingBitRate(int bitRate) ÉèÖÃÂ¼ÖÆµÄÒôƵ±àÂë±ÈÌØÂÊ setAudioSamplingRate(int samplingRate) ÉèÖÃÂ¼ÖÆµÄÒôƵ²ÉÑùÂÊ setAudioSource(int audio_source) ÉèÖÃÓÃÓÚÂ¼ÖÆµÄÒôÔ´

setAuxiliaryOutputFile(String path) ¸¨Öúʱ¼äµÄÍÆÒÆÊÓÆµÎļþµÄ·¾¶´«µÝ

setAuxiliaryOutputFile(FileDescriptor fd)ÔÚÎļþÃèÊö·û´«µÝµÄ¸¨Öúʱ¼äµÄÍÆÒÆÊÓÆµ setCamera(Camera c) ÉèÖÃÒ»¸örecordingµÄÉãÏñÍ· setCaptureRate(double fps) ÉèÖÃÊÓÆµÖ¡µÄ²¶»ñÂÊ

setMaxDuration(int max_duration_ms) ÉèÖüǼ»á»°µÄ×î´ó³ÖÐøÊ±¼ä£¨ºÁÃ룩 setMaxFileSize(long max_filesize_bytes) ÉèÖüǼ»á»°µÄ×î´ó´óС£¨ÒÔ×Ö½ÚΪµ¥Î»£© setOutputFile(FileDescriptor fd) ´«µÝҪдÈëµÄÎļþµÄÎļþÃèÊö·û setOutputFile(String path) ÉèÖÃÊä³öÎļþµÄ·¾¶

setOutputFormat(int output_format) ÉèÖÃÔÚÂ¼ÖÆ¹ý³ÌÖвúÉúµÄÊä³öÎļþµÄ¸ñʽ setPreviewDisplay(Surface sv) ±íÃæÉèÖÃÏÔʾ¼Ç¼ýÌ壨ÊÓÆµ£©µÄÔ¤ÀÀ setVideoEncoder(int video_encoder) ÉèÖÃÊÓÆµ±àÂëÆ÷£¬ÓÃÓÚÂ¼ÖÆ setVideoEncodingBitRate(int bitRate) ÉèÖÃÂ¼ÖÆµÄÊÓÆµ±àÂë±ÈÌØÂÊ setVideoFrameRate(int rate) ÉèÖÃÒª²¶»ñµÄÊÓÆµÖ¡ËÙÂÊ

setVideoSize(int width, int height) ÉèÖÃÒª²¶»ñµÄÊÓÆµµÄ¿í¶ÈºÍ¸ß¶È

setVideoSource(int video_source) ¿ªÊ¼²¶×½ºÍ±àÂëÊý¾Ýµ½setOutputFile£¨Ö¸¶¨µÄÎļþ£© setLocation(float latitude, float longitude) ÉèÖò¢´æ´¢ÔÚÊä³öÎļþÖеĵØÀíÊý¾Ý£¨¾­¶ÈºÍγ¶È£©

setProfile(CamcorderProfile profile) Ö¸¶¨CamcorderProfile¶ÔÏó setOrientationHint(int degrees)ÉèÖÃÊä³öµÄÊÓÆµ²¥·ÅµÄ·½ÏòÌáʾ

setOnErrorListener(MediaRecorder.OnErrorListener l)×¢²áÒ»¸öÓÃÓÚ¼ÇÂ¼Â¼ÖÆÊ±³öÏֵĴíÎóµÄ¼àÌýÆ÷

setOnInfoListener(MediaRecorder.OnInfoListener listener)×¢²áÒ»¸öÓÃÓÚ¼ÇÂ¼Â¼ÖÆÊ±³öÏÖµÄÐÅϢʼþ

getMaxAmplitude() »ñÈ¡ÔÚǰһ´Îµ÷Óô˷½·¨Ö®ºó¼ÒôÖгöÏÖµÄ×î´óÕñ·ù prepare()×¼±¸Â¼ÖÆ¡£ release()ÊÍ·Å×ÊÔ´

reset()½«MediaRecorderÉèΪ¿ÕÏÐ״̬ start()¿ªÊ¼Â¼ÖÆ stop()Í£Ö¹Â¼ÖÆ

MediaRecorderÖ÷ÒªÅäÖòÎÊý£º

1.£©ÊÓÆµ±àÂë¸ñʽMediaRecorder.VideoEncoder

default£¬H263£¬H264£¬MPEG_4_SP£¬VP8

2.£©ÒôƵ±àÂë¸ñʽMediaRecorder.AudioEncoder

default£¬AAC£¬HE_AAC£¬AAC_ELD£¬AMR_NB£¬AMR_WB£¬VORBIS

3.£©ÊÓÆµ×ÊÔ´»ñÈ¡·½Ê½MediaRecorder.VideoSource

default£¬CAMERA£¬SURFACE

4.£©ÒôƵ×ÊÔ´»ñÈ¡·½Ê½MediaRecorder.AudioSource

defalut£¬camcorder£¬mic£¬voice_call£¬

voice_communication,voice_downlink,voice_recognition, voice_uplink

5.£©×ÊÔ´Êä³ö¸ñʽMediaRecorder.OutputFormat

amr_nb£¬amr_wb,default,mpeg_4,raw_amr,three_gpp£¬aac_adif£¬ aac_adts£¬ output_format_rtp_avp£¬ output_format_mpeg2ts £¬webm

MediaRecorderÂ¼ÖÆÊÓÆµ¼òµ¥ÊµÏÖ£º

1.£©ÐèÒªÌí¼ÓȨÏÞ

android:name=\ />

2.£©¼òµ¥ÊµÏÖÂ¼ÖÆÊÓÆµ

public class MediaRecorderActivity extends Activity implements SurfaceHolder.Callback {

private SurfaceView mSurfaceView;

private SurfaceHolder mSurfaceHolder; private Button btnStartStop;

private boolean isRecording = false;//±ê¼ÇÊÇ·ñÒѾ­ÔÚÂ¼ÖÆ private MediaRecorder mRecorder;//ÒôÊÓÆµÂ¼ÖÆÀà private Camera mCamera = null;//Ïà»ú

private Camera.Size mSize = null;//Ïà»úµÄ³ß´ç private int mCameraFacing =

Camera.CameraInfo.CAMERA_FACING_BACK;//ĬÈϺóÖÃÉãÏñÍ·

private static final SparseIntArray orientations = new SparseIntArray();//ÊÖ»úÐýת¶ÔÓ¦µÄµ÷Õû½Ç¶È

static {

orientations.append(Surface.ROTATION_0, 90);

orientations.append(Surface.ROTATION_90, 0); orientations.append(Surface.ROTATION_180, 270); orientations.append(Surface.ROTATION_270, 180); }

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setWindow();

setContentView(R.layout.activity_media_recorder); initViews(); }

private void setWindow() {

requestWindowFeature(Window.FEATURE_NO_TITLE);// È¥µô±êÌâÀ¸

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// ÉèÖÃÈ«ÆÁ

// ÉèÖÃÊúÆÁÏÔʾ

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Ñ¡ÔñÖ§³Ö°ë͸Ã÷ģʽ,ÔÚÓÐsurfaceviewµÄactivityÖÐʹÓᣠgetWindow().setFormat(PixelFormat.TRANSLUCENT); }

private void initViews() {

mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview); btnStartStop = (Button) findViewById(R.id.btnStartStop); btnStartStop.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) { if (!isRecording) { startRecord(); } else {

stopRecord(); } } });

SurfaceHolder holder = mSurfaceView.getHolder();// È¡µÃholder

holder.setFormat(PixelFormat.TRANSPARENT); holder.setKeepScreenOn(true);

holder.addCallback(this); // holder¼ÓÈë»Øµ÷½Ó¿Ú }

/**

* ³õʼ»¯Ïà»ú */

private void initCamera() {

if (Camera.getNumberOfCameras() == 2) { mCamera = Camera.open(mCameraFacing); } else {

mCamera = Camera.open(); }

CameraSizeComparator sizeComparator = new CameraSizeComparator();

Camera.Parameters parameters = mCamera.getParameters();

if (mSize == null) {

List vSizeList = parameters.getSupportedPreviewSizes();

Collections.sort(vSizeList, sizeComparator);

for (int num = 0; num < vSizeList.size(); num++) { Camera.Size size = vSizeList.get(num);

if (size.width >= 800 && size.height >= 480) { this.mSize = size; break; } }

mSize = vSizeList.get(0);

List focusModesList = parameters.getSupportedFocusModes();

//Ôö¼Ó¶Ô¾Û½¹Ä£Ê½µÄÅÐ¶Ï if

(focusModesList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

} else if

(focusModesList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); }

mCamera.setParameters(parameters); }

int rotation =

getWindowManager().getDefaultDisplay().getRotation(); int orientation = orientations.get(rotation); mCamera.setDisplayOrientation(orientation); }

@Override

protected void onResume() { super.onResume(); initCamera(); }

@Override

public void onPause() { releaseCamera(); super.onPause(); }

/**

* ¿ªÊ¼Â¼ÖÆ */

private void startRecord() {

if (mRecorder == null) {

mRecorder = new MediaRecorder(); // ´´½¨MediaRecorder }

if (mCamera != null) { mCamera.stopPreview(); mCamera.unlock();

mRecorder.setCamera(mCamera); } try {

// ÉèÖÃÒôƵ²É¼¯·½Ê½

mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); //ÉèÖÃÊÓÆµµÄ²É¼¯·½Ê½

mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //ÉèÖÃÎļþµÄÊä³ö¸ñʽ

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//aac_adif£¬ aac_adts£¬ output_format_rtp_avp£¬ output_format_mpeg2ts £¬webm //ÉèÖÃaudioµÄ±àÂë¸ñʽ

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //ÉèÖÃvideoµÄ±àÂë¸ñʽ

mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //ÉèÖÃÂ¼ÖÆµÄÊÓÆµ±àÂë±ÈÌØÂÊ

mRecorder.setVideoEncodingBitRate(1024 * 1024); //ÉèÖÃÂ¼ÖÆµÄÊÓÆµÖ¡ÂÊ,×¢ÒâÎĵµµÄ˵Ã÷: mRecorder.setVideoFrameRate(30); //ÉèÖÃÒª²¶»ñµÄÊÓÆµµÄ¿í¶ÈºÍ¸ß¶È

mSurfaceHolder.setFixedSize(320, 240);//×î¸ßÖ»ÄÜÉèÖÃ640x480

mRecorder.setVideoSize(320, 240);//×î¸ßÖ»ÄÜÉèÖÃ640x480 //ÉèÖüǼ»á»°µÄ×î´ó³ÖÐøÊ±¼ä£¨ºÁÃ룩 mRecorder.setMaxDuration(60 * 1000);

mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); String path = getExternalCacheDir().getPath(); if (path != null) {

File dir = new File(path + \ if (!dir.exists()) { dir.mkdir(); }

path = dir + \\

//ÉèÖÃÊä³öÎļþµÄ·¾¶

mRecorder.setOutputFile(path); //×¼±¸Â¼ÖÆ

mRecorder.prepare(); //¿ªÊ¼Â¼ÖÆ

mRecorder.start(); isRecording = true;

btnStartStop.setText(\Í£Ö¹\ }

} catch (Exception e) { e.printStackTrace(); } } /**

* Í£Ö¹Â¼ÖÆ */

private void stopRecord() { try {

//Í£Ö¹Â¼ÖÆ

mRecorder.stop(); //ÖØÖÃ

mRecorder.reset();

btnStartStop.setText(\¿ªÊ¼\ } catch (Exception e) { e.printStackTrace(); }

isRecording = false; }

/**

* ÊÍ·ÅMediaRecorder */

private void releaseMediaRecorder() { if (mRecorder != null) { mRecorder.release(); mRecorder = null; } }

/**

* ÊÍ·ÅÏà»ú×ÊÔ´ */

private void releaseCamera() { try {

if (mCamera != null) {

mCamera.stopPreview();

mCamera.setPreviewCallback(null); mCamera.unlock(); mCamera.release(); }

} catch (RuntimeException e) { } finally {

mCamera = null; } }

@Override

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

int height) {

// ½«holder£¬Õâ¸öholderΪ¿ªÊ¼ÔÚonCreateÀïÃæÈ¡µÃµÄholder£¬½«Ëü¸³¸ømSurfaceHolder

mSurfaceHolder = holder; if (mCamera == null) { return; } try {

//ÉèÖÃÏÔʾ

mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); releaseCamera(); finish(); } }

@Override

public void surfaceCreated(SurfaceHolder holder) {

// ½«holder£¬Õâ¸öholderΪ¿ªÊ¼ÔÚonCreateÀïÃæÈ¡µÃµÄholder£¬½«Ëü¸³¸ømSurfaceHolder

mSurfaceHolder = holder; }

@Override

public void surfaceDestroyed(SurfaceHolder holder) { // surfaceDestroyedµÄʱºòͬʱ¶ÔÏóÉèÖÃΪnull if (isRecording && mCamera != null) { mCamera.lock(); }

mSurfaceView = null; mSurfaceHolder = null; releaseMediaRecorder(); releaseCamera(); }

private class CameraSizeComparator implements Comparator {

public int compare(Camera.Size lhs, Camera.Size rhs) { if (lhs.width == rhs.width) { return 0;

} else if (lhs.width > rhs.width) { return 1; } else {

return -1; } } } }

3.£©²¼¾ÖÎļþ

xmlns:android=\ xmlns:tools=\ android:layout_width=\ android:layout_height=\ android:orientation=\

android:id=\

android:layout_width=\ android:layout_height=\ android:layout_weight=\ />