从相机通过Android 2.2版本录制视频 [英] Record Video from Camera via Version Android 2.2

查看:105
本文介绍了从相机通过Android 2.2版本录制视频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在此输入code 当我尝试在Android 2.2版本记录来自摄像头的视频。它有一些errors.No人能找到解决方案。是否有任何错误的Andr​​oid MediaRecorder API。我怎样才能解决这个问题。 我得到了更多errors.You可以看到其中的图片。 而像这样的错误:相机preVIEW -13 非常感谢。

http://i.stack.imgur.com/72lp7.png 录音机。prepare()将失败并引发Java.lang.illegalexeption 这里是code:

 包app.raceway.com;

进口的java.io.File;
进口java.io.IOException异常;

进口android.app.Activity;
进口android.content.pm.ActivityInfo;
进口android.hardware.Camera;
进口android.media.CamcorderProfile;
进口android.media.MediaRecorder;
进口android.os.Bundle;
进口android.os.Environment;
进口android.util.Log;
进口android.view.SurfaceHolder;
进口android.view.SurfaceView;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.view.Window;
进口android.view.WindowManager;
进口android.widget.Toast;

公共类VideoCapture扩展活动实现SurfaceHolder.Callback {
    MediaRecorder记录;
    SurfaceHolder持有人;
    公共摄像头摄像头;
    文件的视频;
    字符串文件路径;
    布尔记录= FALSE;
      私有静态最终诠释帧频= 15;

      私有静态最终诠释CIF_WIDTH = 320;

      私有静态最终诠释CIF_HEIGHT = 240;
@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow()。setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


    记录=新MediaRecorder();

    的setContentView(R.layout.main);

    SurfaceView cameraView =(SurfaceView)findViewById(R.id.cameraView);
    支架= cameraView.getHolder();
    holder.addCallback(本);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    字符串路径= Environment.getExternalStorageDirectory()。getAbsolutePath()+
    /video/vi​​deocapture_example.mpg4;
    //确保目录,我们计划在用来存放记录
    文件sampleDir = Environment.getExternalStorageDirectory();
    尝试 {
        视频=新的文件(sampleDir +/ videofile.3gp);
        sampleDir.createNewFile();
          //视频= File.createTempFile(videofile,名为.3gp,sampleDir);
      }
      赶上(IOException异常E)
      {
          Log.e(deneme,SD卡访问错误);

      }
      文件路径= video.getAbsolutePath();

}

私人无效initRecorder(){

    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

}
私人无效prepareRecorder()抛出IOException异常{
    recorder.setCamera(照相机);
    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setVideoEn codeR(MediaRecorder.VideoEn coder.H263);
    recorder.setOutputFile(文件路径);
    recorder.setMaxDuration(50000); //50秒
    recorder.setMaxFileSize(5000000); //大约5兆字节
尝试 {

}赶上(IllegalStateException异常E){
    // TODO自动生成的catch块
    e.printStackTrace();
}


}



公共无效onclickSaveVideo(查看V)抛出IOException异常{
    如果(录音){
    吐司T =新吐司(getApplicationContext());
    t.makeText(getApplicationContext(),录像停止,Toast.LENGTH_SHORT);
    t.show();
        recorder.stop();
        记录= FALSE;

        //让我们initRecorder所以我们可以再录
        initRecorder();
    } 其他 {
        尝试 {
            prepareRecorder();
            //recorder.$p$ppare();
        }赶上(IllegalStateException异常E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }
        记录= TRUE;
        。录音机prepare();
        recorder.start();
        尝试 {
            视频下载(10000);
        }赶上(InterruptedException异常E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }
        recorder.stop();
        吐司T =新吐司(getApplicationContext());
        t.makeText(getApplicationContext(),录像开始,Toast.LENGTH_SHORT);
        t.show();
    }
}
@覆盖
公共无效surfaceCreated(SurfaceHolder持有者){
    相机= Camera.open();

    尝试 {
        camera.set previewDisplay(保持器);
    }赶上(IOException异常E1){
        // TODO自动生成的catch块
        e1.printStackTrace();
    }
    camera.start preVIEW();
    camera.unlock();
}
@覆盖
公共无效surfaceChanged(SurfaceHolder持有人,INT格式,INT W,INT高){

}
@覆盖
公共无效surfaceDestroyed(SurfaceHolder持有者){
    如果(录音){
        recorder.stop();
        记录= FALSE;
    }
    recorder.release();
    完();
    camera.release();
}


}
 

解决方案

额敏,

根据您提供的崩溃是发生在相对=nofollow> 启动() 方法。你会从为启动方法的 prepare() 必须先调用否则会抛出 IllegalStateException异常。在您的code所有调用的 prepare()被注释掉了?

编辑:我们整理出来的东西在我的回答如下的评论。他是在模拟器上运行此code和 MediaRecorder 不被模拟器支持。

enter code hereWhen I try to recording video from camera at version Android 2.2. It has some errors.No one could find the solution. İs there any bug Android MediaRecorder API. How can I solve this. I got more errors.You can see some of them in picture. And an error like that:Camera Preview -13 Thanks a lot.

http://i.stack.imgur.com/72lp7.png recorder.prepare() fails and throws Java.lang.illegalexeption Here is Code:

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();
}


}

解决方案

Emin,

Based on the image of the logcat output you provide the crash is occuring with the start() method. You will see from the documentation for the start method that prepare() must be called first or else it will throw the IllegalStateException. In your code all the calls the prepare() are commented out?

EDIT: We sorted things out in the comments below my answer. He was running this code on an emulator and MediaRecorder is not supported by the emulator.

这篇关于从相机通过Android 2.2版本录制视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆