Kason Wong 2019-03-06 11:53 采纳率: 0%
浏览 2507

Android Camera2 如何同时前后摄像头录像?

同时预览preview能实现,点击按钮进行同时录像怎么做?(要解决线程问题)
图片说明
有酬!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 04:59
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Android中,我们可以使用MediaRecorder类来创建和控制视频记录。以下是一个简单的示例,展示了如何在Android中同时预览两个摄像头:

    public class MainActivity extends AppCompatActivity {
    
        private MediaRecorder recorder;
        private MediaFormat format;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 创建一个媒体格式对象,用于设置输出的视频文件格式
            format = new MediaFormat();
            format.setInteger(MediaFormat.KEY_OUTPUT_WIDTH, 1920);
            format.setInteger(MediaFormat.KEY_OUTPUT_HEIGHT, 1080);
            format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
            format.setString(MediaFormat.KEY_MIME_TYPE, "video/avc");
    
            // 创建一个MediaRecorder实例,并设置输出格式
            recorder = new MediaRecorder();
            recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            recorder.setOutputFormat(format);
            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            recorder.setOutputFile("/storage/emulated/0/MyVideo.mp4");
            recorder.prepare();
    
            // 开始录制
            recorder.start();
    
            // 同时打开前、后摄像头
            if (Camera.open(0) != null) {
                Camera.Parameters parameters = Camera.getParameters(Camera.CameraInfo.CAMERA_FACING_FRONT);
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                Camera.setDisplayOrientation(0, 0, 0);
                Camera.setPreviewCallback(new PreviewCallback());
                Camera.open(0).setParameters(parameters);
            }
            if (Camera.open(1) != null) {
                Camera.Parameters parameters = Camera.getParameters(Camera.CameraInfo.CAMERA_FACING_BACK);
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                Camera.setDisplayOrientation(90, 0, 0);
                Camera.setPreviewCallback(new PreviewCallback());
                Camera.open(1).setParameters(parameters);
            }
    
            // 设置一个回调函数,在录制完成后调用
            recorder.setOnErrorListener(new OnErrorListener() {
                public boolean onError(int what, int extra) {
                    return false;
                }
            });
    
            // 等待录制完成
            while (!recorder.isEos()) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            // 关闭所有摄像头
            Camera.close();
            recorder.stop();
            recorder.release();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // 清除之前打开的摄像头
            Camera.close(0);
            Camera.close(1);
        }
    
        // 这个回调函数会在录制结束后被调用
        private final Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                // 处理视频数据
                // ...
            }
        };
    
        // 这个回调函数会处理错误情况
        private final MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {
            @Override
            public boolean onError(int what, int extra) {
                // 处理错误情况
                // ...
                return true; // 如果没有其他错误,则返回true
            }
        };
    }
    

    在这个例子中,我们首先创建了一个MediaRecorder实例,并设置了输出格式为MP4。然后,我们打开了前、后摄像头,并设置了它们的参数。

    接下来,我们在onCreate方法中启动了录制。在录制过程中,我们定义了一个回调函数,当录制完成时,这个回调函数会被调用。

    最后,当我们不再需要摄像头时,我们需要关闭它们。我们通过Camera.close()方法关闭了所有的摄像头。

    请注意,这只是一个基本的例子,实际使用时可能需要根据你的具体需求进行修改。例如,你可能需要处理视频数据,或者添加更多的错误处理逻辑。

    评论

报告相同问题?