通过Android 2.2版从摄像头录制视频
通过Android 2.2版从摄像头录制视频,android,video,video-capture,Android,Video,Video Capture,在这里输入code当我尝试在安卓2.2版上从摄像头录制视频时。它有一些错误。没有人能找到解决方案。İAndroid MediaRecorder API有任何缺陷。我怎样才能解决这个问题。 我有更多的错误。你们可以在图片中看到其中的一些。 还有这样一个错误:相机预览-13 非常感谢 recorder.prepare()失败并抛出Java.lang.illegalexeption 以下是代码: package app.raceway.com; import java.io.File; impor
在这里输入code
当我尝试在安卓2.2版上从摄像头录制视频时。它有一些错误。没有人能找到解决方案。İAndroid MediaRecorder API有任何缺陷。我怎样才能解决这个问题。
我有更多的错误。你们可以在图片中看到其中的一些。
还有这样一个错误:相机预览-13
非常感谢
recorder.prepare()失败并抛出Java.lang.illegalexeption
以下是代码:
package app.raceway.com;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
public class VideoCapture extends Activity implements SurfaceHolder.Callback {
MediaRecorder recorder;
SurfaceHolder holder;
public Camera camera;
File video;
String filePath;
boolean recording = false;
private static final int FRAME_RATE = 15;
private static final int CIF_WIDTH = 320;
private static final int CIF_HEIGHT = 240;
@Override
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);
recorder = new MediaRecorder();
setContentView(R.layout.main);
SurfaceView cameraView = (SurfaceView) findViewById(R.id.cameraView);
holder = cameraView.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+
"/video/videocapture_example.mpg4";
// make sure the directory we plan to store the recording in exists
File sampleDir = Environment.getExternalStorageDirectory();
try {
video = new File(sampleDir+"/videofile.3gp");
sampleDir.createNewFile();
//video = File.createTempFile("videofile", ".3gp", sampleDir);
}
catch (IOException e)
{
Log.e("deneme","sdcard access error");
}
filePath=video.getAbsolutePath();
}
private void initRecorder() {
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
}
private void prepareRecorder() throws IOException{
recorder.setCamera(camera);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
recorder.setOutputFile(filePath);
recorder.setMaxDuration(50000); // 50 seconds
recorder.setMaxFileSize(5000000); // Approximately 5 megabytes
try {
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void onclickSaveVideo(View v) throws IOException {
if (recording) {
Toast t=new Toast(getApplicationContext());
t.makeText(getApplicationContext(), "Video Recording stopped",Toast.LENGTH_SHORT);
t.show();
recorder.stop();
recording = false;
// Let's initRecorder so we can record again
initRecorder();
} else {
try {
prepareRecorder();
//recorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
recording = true;
recorder.prepare();
recorder.start();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
recorder.stop();
Toast t=new Toast(getApplicationContext());
t.makeText(getApplicationContext(), "Video Recording started",Toast.LENGTH_SHORT);
t.show();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera=Camera.open();
try {
camera.setPreviewDisplay(holder);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
camera.startPreview();
camera.unlock();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (recording) {
recorder.stop();
recording = false;
}
recorder.release();
finish();
camera.release();
}
}
艾敏
根据您提供的logcat输出图像,该方法正在发生崩溃。您将从文档中看到必须首先调用的start
方法,否则它将抛出IllegalStateException
。在您的代码中,prepare()
的所有调用都被注释掉了吗
编辑:我们在我的回答下面的评论中把事情整理好了。他在模拟器上运行此代码,而该模拟器不支持
MediaRecorder
。我添加了代码。请帮助我找到解决方案。我试了10天。Willytate,我试了很多次,但当我试着解决问题时,我把它标记为注释。当我取消注释recorder.prepare()时。它有错误:**java.io.IOException:准备失败。**ahh。只是为了再次检查您是否在模拟器上尝试此操作,对吗?我更新了代码。我使用的是right emulator(Android 2.2)。我的错误发生了变化:06-01 16:37:13.057:error/CameraInput(34):没有可用于显示的曲面06-01 16:37:13.057:error/AuthorDriver(34):命令13已完成,错误为-1 06-01 16:37:13.067:error/MediaRecorder(625):准备失败:-1如果您能提供帮助,那就太好了。“注意:目前,MediaRecorder在模拟器上不工作。”请参阅:好的。谢谢你救了我的命:)。我为此工作了大约十天。我尝试了所有方法,但我没有意识到”“注意:目前,MediaRecorder在模拟器上不工作。”“这个。非常感谢budy