最近研究一下怎么使用android录像功能,在网上找的例子无尽的报错,脑袋都大了,还好现在一个一个解决了...........。
遇到了N多个问题,开始时start failed,后来又stop failed,整理在这供自己以后学习参考,如果大家有更好的方法-->>回帖告诉俄这个菜鸟哦....
先给个图吧,测试时在模拟器上测试的.......,如果哪位能在真机上测试报错的话,反馈一下错误信息,相互学习一下了
主页代码如下:
package com.zte.camera_test;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import android.hardware.Camera;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.annotation.SuppressLint;import android.app.Activity;public class MainActivity extends Activity { Button button; boolean isRecording = false; MediaRecorder mMediaRecorder; private SurfaceView mPreview; public static final int MEDIA_TYPE_IMAGE = 1; public static final int MEDIA_TYPE_VIDEO = 2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button = (Button) findViewById(R.id.layout_button); mPreview = (SurfaceView) findViewById(R.id.layout_surfeve); buttonClickListener(); } public void buttonClickListener() { button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (isRecording) { releaseMediaRecorder();// 释放MediaRecorder对象 isRecording = false; } else { // 初始化视频camera if (prepareVideoRecorder()) { // Camera已可用并解锁,MediaRecorder已就绪, // 现在可以开始录像 mMediaRecorder.start(); isRecording = true; } else { // 准备未能完成,释放camera releaseMediaRecorder(); } } } }); } private boolean prepareVideoRecorder() { mMediaRecorder = new MediaRecorder(); // 指定源录音及录像--->>>开始自己用的是camera录制视频,报错,stop fail mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 设置录制的视频编码h263 h264 mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //没有设置大小报错,start faild(240-320,320-480,600-480,480-800,800-600)过好内是我试过的大小,只有240-320情况下报错 mMediaRecorder.setVideoSize(800, 600); // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错 mMediaRecorder.setVideoFrameRate(20); // 指定输出文件 mMediaRecorder.setOutputFile(getOutputMediaFile() .toString()); // 指定预览输出 mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); // 根据以上配置准备MediaRecorder try { mMediaRecorder.prepare(); } catch (IllegalStateException e) { releaseMediaRecorder(); return false; } catch (IOException e) { releaseMediaRecorder(); return false; } return true; } private void releaseMediaRecorder() { if (mMediaRecorder != null) { mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release();// 释放recorder对象 mMediaRecorder = null; } } private static File getOutputMediaFile() { File mediaStorageDir = new File( Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyCameraApp"); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { return null; } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") .format(new Date()); File mediaFile; mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4"); return mediaFile; } protected void onPause() { super.onPause(); releaseMediaRecorder(); } @Override protected void onDestroy() { releaseMediaRecorder(); super.onDestroy(); }}
xml布局如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <SurfaceView android:id="@+id/layout_surfeve" android:layout_width="480dip" android:layout_height="400dip" > </SurfaceView> <Button android:id="@+id/layout_button" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_below="@id/layout_surfeve" android:text="clicklistener" /> <!-- <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" tools:context=".MainActivity" /> --></RelativeLayout>
别忘了加权限哦......:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zte.camera_test" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_VIDEO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /></manifest>下面是录制完后的播放效果,不过是在模拟器下,没什么意思,也放着看下了...