智能手機操作系統(tǒng)IOS與Android平分天下(PS:WP與其他的直接無視了),而Android的免費招來了一大堆廠商分分向Android示好,故Android可能會有“較好”的前景。
Android實現(xiàn)簡單的錄音、播音與視頻錄制功能。當然了、無論是出場綁定的還是第三方都有很多很好的應用。但是對于一名開發(fā)人員來說及時做的UI再丑、功能再爛那也是一種成就!
實現(xiàn)錄音、錄制視頻功能需要調(diào)用【MediaRecorder】類,播放音頻則需要【MediaPlayer】類。那簡單以實現(xiàn)錄音、錄制視頻、播放音頻為例寫一個自己的SoundRecordingHelper類。
思路:Android已經(jīng)封裝好了這兩個類只需要進行簡單的設置就可以實現(xiàn)這三個功能了 1、需要在工程文件中添加需要的權限 2、設置布局文件 3、調(diào)用自己封裝的SoundRecordingHelper類。下面主要講SoundRecordingHelper類,實現(xiàn)功能直接調(diào)用此類中的Start與Stop方法即可。
package com.clown.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 = ""; // 數(shù)據(jù)上下文 private Context context = null; // 媒體播放對象 private MediaPlayer mPlayer = null; // 媒體錄音對象 private MediaRecorder mRecorder = null; // 用來顯示視頻的一個接口,我靠不用還不行,也就是說用mediarecorder錄制視頻還得給個界面看 // 想偷偷錄視頻的同學可以考慮別的辦法。。嗯需要實現(xiàn)這個接口的Callback接口 private SurfaceHolder surfaceHolder;
public String getStrFilePath() { return strFilePath; }
public void setStrFilePath(String strFilePath) { this.strFilePath = strFilePath; }
/* * 音頻錄制的構造函數(shù) */ public SoundRecordingHelper(Context context, String strFilePath) { this.context = context; this.strFilePath = strFilePath; }
/* * 視頻錄制的構造函數(shù) */ @SuppressWarnings("deprecation") public SoundRecordingHelper(Context context, SurfaceView surfaceview, String strFilePath) { this.context = context; this.surfaceHolder = surfaceview.getHolder(); this.surfaceHolder.addCallback(this); // 加入回調(diào)接口 this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 這個方法已經(jīng)過時了,但是為了兼容低版本必須設置 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; }
/* * 調(diào)用攝像頭進行視頻錄制 nWidth:視頻的寬 * nHeight:視頻的高nRate:視頻幀數(shù)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接口實現(xiàn)方法 */ @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; } } }
注:實現(xiàn)視頻錄制時需要在UI布局中添加 Surfaceview控件,用以實時預覽視頻。如分辨率過低是會導致視頻花屏! |