【问题标题】:how to record from front camera如何从前置摄像头录制
【发布时间】:2013-07-06 12:20:07
【问题描述】:

我只需要从前置摄像头录制视频,我搜索了很多,但无法找到解决方案(简单)

如果我将相机类型设置为 1,应用程序会崩溃..

这是我的代码

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
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.Button;
import android.widget.Toast;

public class VideoCapture extends Activity implements OnClickListener, SurfaceHolder.Callback {
    MediaRecorder recorder;
    SurfaceHolder holder;
    boolean recording = false;
    String pathVideo;
    private int cameraType = 1;
    @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); */

        pathVideo = "/reg_" + System.currentTimeMillis() + ".mp4";
        recorder = new MediaRecorder();
        initRecorder();
        setContentView(R.layout.camera);

        SurfaceView cameraView = (SurfaceView) findViewById(R.id.surface_camera);
        holder = cameraView.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);



        Button rec =(Button) findViewById(R.id.buttonstart);
        rec.setOnClickListener(new OnClickListener() {
            public void onClick(View v)
            {
                  if (recording) {
                      recorder.stop();
                      recording = false;
                      recorder.release();
                      // Let's initRecorder so we can record again
                    initRecorder();
                    prepareRecorder();
                  } else {
                      recording = true;
                      recorder.start();
                  }
            } 
         });
    }

    private void initRecorder() {

        recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        CamcorderProfile cpHigh = CamcorderProfile
                .get(CamcorderProfile.QUALITY_HIGH);
        recorder.setProfile(cpHigh);


          File Directory = new File("/sdcard/CantaTu/");
       // have the object build the directory structure, if needed.
       Directory.mkdirs();
       File mediaFile = new File(Directory,pathVideo);

        if(mediaFile.exists()){
         mediaFile.delete();
        }
        recorder.setOutputFile(mediaFile.getAbsolutePath());
        recorder.setMaxDuration(400000); // 50 seconds
        recorder.setMaxFileSize(50000000); // Approximately 5 megabytes
    }

    private void prepareRecorder() {
        recorder.setPreviewDisplay(holder.getSurface());

        try {

            recorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
            finish();
        } catch (IOException e) {
            e.printStackTrace();
            finish();
        }
    }



    public void surfaceCreated(SurfaceHolder holder) {
        //camera = Camera.open(cameraType);
        prepareRecorder();
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        if (recording) {
            recorder.stop();
            recording = false;
            recorder.release();
        }
        recorder.release();
        //finish();
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }
}

没有办法简单地录制到前置摄像头吗? 谢谢!

编辑

这是我的实际代码(如果我尝试打开前置摄像头,它就不起作用)

      public void inizializzazione(){

          cameraView.setVisibility(0);


          boolean found = false;
             int i;

             for(i=0; i< Camera.getNumberOfCameras(); i++){
                 System.out.println("camera n " +i);
                 Camera.CameraInfo newInfo = new Camera.CameraInfo();
                 Camera. getCameraInfo(i, newInfo);

                 if (newInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                     try {
                         found = true;
                        cam = Camera.open(i);
                        System.out.println("trovata la fotocamera frontale");
                     } catch (RuntimeException e) {
                         Log.e("Your_TAG", "Camera failed to open: " + e.getLocalizedMessage());
                     }


             }



            pathVideo = "/reg_" + System.currentTimeMillis() + ".mp4";
          File Directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +"/CantaTu/");
           // have the object build the directory structure, if needed.
           Directory.mkdirs();
           File mediaFile = new File(Directory,pathVideo);

            if(mediaFile.exists()){
             mediaFile.delete();
            }



            recorder = new MediaRecorder();

             holder = cameraView.getHolder();
             holder.addCallback(this);
             holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

            recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
            recorder.setVideoSource(1);

             CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);

            recorder.setProfile(cpHigh);

             recorder.setOutputFile(mediaFile.getAbsolutePath());
             recorder.setMaxDuration(400000); // 50 seconds

             recorder.setPreviewDisplay(holder.getSurface());




             try {
                 if(found == true){
                     recorder.setCamera(cam);
                 } 
                recorder.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

             recorder.start();

             scritta.setVisibility(0);
             caricamento.setVisibility(4);





      }

}

我不知道为什么它不打开前置摄像头... 错误是“start calls in an invalid state”(因为它找到了前置摄像头,并尝试设置)

【问题讨论】:

  • 有一些特殊情况需要注意;例如,Nexus 7 和其他一些设备可能只有前置摄像头。即使只有一台相机,您仍然需要通过id 明确选择它。另见stackoverflow.com/questions/12010383/…
  • 我认为问题不在于清单,因为前置摄像头工作正常......我在摄像头权限上设置了 android:required="false"

标签: android video camera video-recording


【解决方案1】:

你需要找到前置摄像头的id。要做到这一点,去

boolean found = false;
int i;
for (i=0; i< Camera.getNumberOfCameras(); i++) {
    Camera.CameraInfo newInfo = new Camera.CameraInfo();
    Camera.getCameraInfo(i, newInfo);
    if (newInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
        found = true;
        break;
    }
}

如果 found 为真,i 是前置摄像头 id。然后你需要打开那个摄像头并传入

recorder.setCamera(Camera.open(i));

【讨论】:

  • 谢谢,if(newInfo.facing == CAMERA_FACING_FRONT CAMERA_FACING_FRONT is a simple string?
  • 我尝试使用“1”,但不适用于 recorder.setCamera(Camera.open(i)); java.illegalStateException 我已经在 initRecorder() 中插入了你的代码,对吗?
  • 应该是CameraInfo.CAMERA_FACING_FRONT
  • 是 newInfo.CAMERA_FACING_FRONT 但它返回 true 这是正确的吗? if(found == true){ recorder.setCamera(Camera.open(i)); } recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); CamcorderProfile cpHigh = CamcorderProfile .get(CamcorderProfile.QUALITY_HIGH);记录器.setProfile(cpHigh); setProfile 中的错误
  • @Lele:可能是前置摄像头不支持QUALITY_HIGH。您测试哪种设备,以及哪个系统版本?
【解决方案2】:

回答太晚了,但我遇到了同样的问题,最后我在堆栈上发现了问题。您可以为后置摄像头设置高配置。

//For Front Camera
     CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);

但您不能为前置摄像头设置高调。我在我的情况下使用了 480P,例如

//For back camera
     CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);

您可以在这篇文章中找到详细信息。 Android can't record video with Front Facing Camera, MediaRecorder start failed: -19

【讨论】:

  • 是的,我知道,但它可以对其他人有所帮助
猜你喜欢
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 2016-03-06
  • 2012-12-18
  • 1970-01-01
相关资源
最近更新 更多