public class RVideoActivity extends Activity implements SurfaceHolder.Callback {
private ImageView start;// 開始錄製按鈕
private ImageView stop;// 中止錄製按鈕
private MediaRecorder mediarecorder;// 錄製視頻的類
private SurfaceView surfaceview;// 顯示視頻的控件
boolean isRecord = true;
private SurfaceHolder surfaceHolder;
boolean isPreView;// 是否預覽
Camera camera; android
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉標題欄
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 設置全屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 設置橫屏顯示
// 選擇支持半透明模式,在有surfaceview的activity中使用。
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.main);
init(); ide
} this
private void init() {
start = (ImageView) this.findViewById(R.id.tv_start);
stop = (ImageView) this.findViewById(R.id.tv_stop);
start.setOnClickListener(new TestVideoListener());
stop.setOnClickListener(new TestVideoListener());
surfaceview = (SurfaceView) this.findViewById(R.id.surfaceview);
SurfaceHolder holder = surfaceview.getHolder();// 取得holder
holder.addCallback(this); // holder加入回調接口
// setType必須設置,要不出錯.
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 編碼
} spa
class TestVideoListener implements OnClickListener {
@Override
public void onClick(View v) {
if (v == start) {
if (isPreView && camera != null) {
camera.startPreview();
camera.release();
camera = null;
}
mediarecorder = new MediaRecorder();// 建立mediarecorder對象
mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 從麥克風採集聲音
// 設置錄製視頻源爲Camera(相機)
mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 設置錄製完成後視頻的封裝格式THREE_GPP爲3gp.MPEG_4爲mp4
mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// 聲音的編碼格式
// 設置錄製的視頻編碼h263 h264
mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
// 設置視頻錄製的分辨率。必須放在設置編碼和格式的後面,不然報錯
mediarecorder.setVideoSize(320, 240);
// 設置錄製的視頻幀率。必須放在設置編碼和格式的後面,不然報錯
mediarecorder.setVideoFrameRate(10);
mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());
// 設置視頻文件輸出的路徑
mediarecorder.setOutputFile("/emmc/love1.3gp");
try {
// 準備錄製
mediarecorder.prepare();
// 開始錄製
mediarecorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} code
if (v == stop) {
if (mediarecorder != null) {
// 中止錄製
mediarecorder.stop();
// 釋放資源
mediarecorder.release();
mediarecorder = null;
}
}
}
} orm
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 將holder,這個holder爲開始在oncreat裏面取得的holder,將它賦給surfaceHolder
surfaceHolder = holder;
} 視頻
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewFrameRate(5);// 每秒5幀
parameters.setPictureFormat(PixelFormat.JPEG);// 設置照片的輸出格式
parameters.set("jpeg-quality", 85);// 設置照片質量
camera.setParameters(parameters);
camera.setPreviewDisplay(holder);
camera.startPreview();
isPreView = true;
} catch (IOException e) {
e.printStackTrace();
}
// 將holder,這個holder爲開始在oncreat裏面取得的holder,將它賦給surfaceHolder
surfaceHolder = holder; xml
} 對象
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.startPreview();
isPreView = false;
camera.release();
camera = null;// 釋放
}
// surfaceDestroyed的時候同時對象設置爲null
surfaceview = null;
surfaceHolder = null;
mediarecorder = null;
}
}
xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#4f5555"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center" >
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="300dp"
android:layout_height="250dp" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="7"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/tv_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/video_recorder_recording_btn" />
<ImageView
android:id="@+id/tv_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/video_recorder_start_btn_press" />
</LinearLayout>
</LinearLayout>