//Set the video output format and encoding. // mRecorder01.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//3GP MPEG_4=>MP4 // mRecorder01.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置 音频 编码类型 // mRecorder01.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置 视频编码类型
//Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() File myRecordFile = new File(strCaptureVideoFilePath); mRecorder01.setOutputFile(myRecordFile.toString());
//Set the video output format and encoding. // mRecorder01.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//3GP MPEG_4=>MP4 // mRecorder01.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置 音频 编码类型 // mRecorder01.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置 视频编码类型
//Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() File myRecordFile = new File(strCaptureVideoFilePath); mRecorder01.setOutputFile(myRecordFile.toString());
private PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { // TODO Handle RAW image data } }; private PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { // TODO Handle JPEG image data Bitmap bm = BitmapFactory.decodeByteArray(_data, 0, _data.length); File myCaptureFile = new File(strCaptureFilePath);
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }
/**/
@Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub
} @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub
} @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub mCamera01.release(); } }
<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"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>
我感觉应该不是这个问题,也许是我程序的哪里没弄清楚,我在研究下··
按照您的方法改了下,可以预览,但是我点击照相后,就出现错误了··我是在我的 手机上调试的:是安卓2.3.5的
应该是一下的函数有问题,请高手看看:private void videoRecord()
{
if(record_flag==true){
/* */
if(record_stop){
mCamera01.unlock();// 解锁相机
mRecorder01 = new MediaRecorder();///////////?????
mRecorder01.reset();//////////
mRecorder01.setCamera(mCamera01);// 指定 使用的相机
//Set the audio source
mRecorder01.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//.DEFAULT
mRecorder01.setAudioSource(MediaRecorder.VideoSource.CAMERA);
mRecorder01.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
// CamcorderProfile mCamcorderProfile = CamcorderProfile.get(CameraInfo.CAMERA_FACING_BACK, CamcorderProfile.QUALITY_LOW);
// mRecorder01.setProfile(mCamcorderProfile);
//Set the video output format and encoding.
// mRecorder01.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//3GP MPEG_4=>MP4
// mRecorder01.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置 音频 编码类型
// mRecorder01.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置 视频编码类型
//Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()
File myRecordFile = new File(strCaptureVideoFilePath);
mRecorder01.setOutputFile(myRecordFile.toString());
// mRecorder01.setVideoFrameRate(5);
// mRecorder01.setVideoSize(320, 240);
//Specify the SurfaceView preview layout element for your application
mRecorder01.setPreviewDisplay(mSurfaceView01.getHolder().getSurface());
//Prepare the MediaRecorder
try {
mRecorder01.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
releaseRecorder();
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
releaseRecorder();
e.printStackTrace();
}/**/
mRecorder01.start();
record_stop=false;
mButton03.setText("Stop");
}
else
{
//release media recorder
releaseRecorder();
//release Camera
mButton03.setText("Capture");
resetCamera();
record_stop = true;
}
}
}
/**/
把你的错误log 贴一下
还有 你可以根据我那篇 日志
和日志下面的 源代码 那个源代码 我调试成功的
recorder.setVideoFrameRate(20);
这2行需要注释才可以,楼主可以试试的
mRecorder01.setAudioSource(MediaRecorder.VideoSource.CAMERA); mRecorder01.setVideoSource(MediaRecorder.VideoSource.CAMERA);应该是这样吧 仔细点应该能该对 在核对一下代码
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.ActivityInfo;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.media.CameraProfile;import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.Menu;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View.OnClickListener;import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity implements SurfaceHolder.Callback{//
private Camera mCamera01;
private Button mButton01, mButton02, mButton03;//, mButton04
private ImageView mImageView01;
private SurfaceView mSurfaceView01;
private SurfaceHolder mSurfaceHolder01; private boolean bIfPreview = false; //设置时 录像 还是拍照
private boolean camera_flag = true;
private boolean record_flag = false;
private boolean record_stop = true;
/*利用时间作为 文件的名称*/
// String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
private String strCaptureFilePath ;
private String strCaptureVideoFilePath;
private MediaRecorder mRecorder01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// mTextView01 = (TextView) findViewById(R.id.textView1);
mImageView01 = (ImageView) findViewById(R.id.imageView1);
mSurfaceView01 = (SurfaceView) findViewById(R.id.surfaceView1);
mSurfaceHolder01 = mSurfaceView01.getHolder();
/* */
mSurfaceHolder01.addCallback(MainActivity.this);
mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mButton01 = (Button)findViewById(R.id.button1);
mButton02 = (Button)findViewById(R.id.button2);
mButton03 = (Button)findViewById(R.id.button3);
// mButton04 = (Button)findViewById(R.id.button4);
mButton01.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0)
{
initCamera();
}
});
mButton02.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0)
{ String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
strCaptureFilePath = "/sdcard/DCIM/Camera"+File.separator+"img_"+timeStamp+".jpg";
takePicture();
}
});
mButton03.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0)
{ String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
strCaptureVideoFilePath = "/sdcard/DCIM/Camera"+File.separator+"vid_"+timeStamp+".mp4";
videoRecord();
}
});
}
private void initCamera()
{
/* */
if(camera_flag == true){
mButton03.setEnabled(false);
if(!bIfPreview)
{
mCamera01 = Camera.open();
} if (mCamera01 != null && !bIfPreview)
{
Camera.Parameters parameters = mCamera01.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPreviewSize(320, 240);
parameters.setPictureSize(320, 240);
mCamera01.setParameters(parameters);
try{
mCamera01.setPreviewDisplay(mSurfaceHolder01);}
catch(Exception e){
e.printStackTrace();
}
mCamera01.startPreview();
bIfPreview = true;
}
}else if(record_flag == true){
mButton03.setText("Capture");
mButton02.setEnabled(false);
if(!bIfPreview)
{
mCamera01 = Camera.open();
}
if (mCamera01 != null && !bIfPreview)
{
try {
mCamera01.setPreviewDisplay(mSurfaceHolder01);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mCamera01.setDisplayOrientation(180);
mCamera01.startPreview();
bIfPreview = true;
//
}
}
}
private void videoRecord()
{
if(record_flag==true){
/* */
if(record_stop){
mCamera01.unlock();// 解锁相机
mRecorder01 = new MediaRecorder();///////////?????
mRecorder01.reset();//////////
mRecorder01.setCamera(mCamera01);// 指定 使用的相机
//Set the audio source
mRecorder01.setAudioSource(MediaRecorder.VideoSource.CAMERA);
mRecorder01.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//.DEFAULT
mRecorder01.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
// CamcorderProfile mCamcorderProfile = CamcorderProfile.get(CameraInfo.CAMERA_FACING_BACK, CamcorderProfile.QUALITY_LOW);
// mRecorder01.setProfile(mCamcorderProfile);
//Set the video output format and encoding.
// mRecorder01.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//3GP MPEG_4=>MP4
// mRecorder01.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置 音频 编码类型
// mRecorder01.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置 视频编码类型
//Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()
File myRecordFile = new File(strCaptureVideoFilePath);
mRecorder01.setOutputFile(myRecordFile.toString());
// mRecorder01.setVideoFrameRate(5);
// mRecorder01.setVideoSize(320, 240);
//Specify the SurfaceView preview layout element for your application
mRecorder01.setPreviewDisplay(mSurfaceView01.getHolder().getSurface());
//Prepare the MediaRecorder
try {
mRecorder01.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
releaseRecorder();
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
releaseRecorder();
e.printStackTrace();
}/**/
mRecorder01.start();
record_stop=false;
mButton03.setText("Stop");
}
else
{
//release media recorder
releaseRecorder();
//release Camera
resetCamera();
record_stop = true;
mButton03.setText("Capture");
}
}
}
/**/
private void takePicture()
{
if (mCamera01 != null && bIfPreview)
{
mCamera01.takePicture(shutterCallback, rawCallback, jpegCallback);
}
} private ShutterCallback shutterCallback = new ShutterCallback()
{
public void onShutter()
{
// Shutter has closed
}
};
private PictureCallback rawCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{
// TODO Handle RAW image data
}
}; private PictureCallback jpegCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{
// TODO Handle JPEG image data
Bitmap bm = BitmapFactory.decodeByteArray(_data, 0, _data.length);
File myCaptureFile = new File(strCaptureFilePath);
try
{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
// mImageView01.setImageBitmap(bm);
resetCamera();
initCamera();
}
catch (Exception e)
{
}
}
};
private void releaseRecorder()
{
if(mRecorder01!=null){
mRecorder01.stop();
//mCamera01.lock();
mRecorder01.reset();
mRecorder01.release();
mRecorder01 = null;
//
/* try {
mCamera01.reconnect();
} catch (IOException e) {
Toast.makeText(this, "reconect fail", 0).show();
e.printStackTrace();
}*/
}
} /* */
private void resetCamera()
{
if (mCamera01 != null && bIfPreview)
{
mCamera01.stopPreview();
// mCamera01.release();
mCamera01 = null;
bIfPreview = false;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
} @Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera01.release();
}
}