lzh910503 2013-10-30 07:13 采纳率: 0%
浏览 866

Android,关于摄像头开发问题求指导!

程序需要调用摄像头,完成录像功能,要求在录制时可以对**视频质量**(分辨率,编码器,格式的MP4或3GP,码率,帧率)进行设置!(类似LG相机)

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-19 18:47
    关注

    该回答引用ChatGPT

    实现 Android 摄像头开发需要使用 Android 提供的 Camera API 或 Camera2 API。以下是一些基本步骤:

    • 获取 Camera 实例:通过调用 Camera.open() 方法获取 Camera 实例,该方法接受一个参数表示要使用哪个摄像头(前置或后置)。
    • 配置 Camera 参数:通过 Camera.Parameters 类来配置摄像头参数,例如设置分辨率、码率、帧率等。
    • 预览摄像头:使用 SurfaceView 或 TextureView 等预览摄像头画面。
    • 录制视频:使用 MediaRecorder 类来录制视频,可以通过 setVideoSize()、setVideoEncodingBitRate()、setOutputFormat()、setVideoEncoder() 等方法来设置视频质量。

    以下是一个简单的示例代码:

    private Camera mCamera;
    private MediaRecorder mMediaRecorder;
    private SurfaceView mPreview;
    
    private void prepareCamera() {
        mCamera = Camera.open();
        Camera.Parameters params = mCamera.getParameters();
        params.setPreviewSize(640, 480);
        mCamera.setParameters(params);
    
        mPreview = findViewById(R.id.preview);
        SurfaceHolder holder = mPreview.getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    mCamera.setPreviewDisplay(holder);
                    mCamera.startPreview();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }
    
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                mCamera.stopPreview();
                mCamera.release();
                mCamera = null;
            }
        });
    }
    
    private void prepareRecorder() throws IOException {
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mMediaRecorder.setVideoSize(640, 480);
        mMediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);
        mMediaRecorder.setOutputFile(getOutputMediaFile().toString());
        mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
        mMediaRecorder.prepare();
    }
    
    private void startRecording() {
        try {
            prepareRecorder();
            mMediaRecorder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void stopRecording() {
        mMediaRecorder.stop();
        mMediaRecorder.reset();
        mMediaRecorder.release();
        mMediaRecorder = null;
    }
    
    private File getOutputMediaFile() {
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_MOVIES), "MyCameraApp");
    
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                return null;
            }
        }
    
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "VID_" + timeStamp + ".mp4");
    
        return mediaFile;
    }
    

    该示例代码可以预览摄像头画面,并录制视频到指定文件。你可以根据需要修改其中的参数。

    评论

报告相同问题?

悬赏问题

  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误