Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 开始视频录制时屏幕闪烁并调整大小大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在将照片/视频捕捉整合到我的应用中,并且遇到视频捕捉问题.每当视频录制开始时,屏幕会闪烁,我会暂停一下,然后开始录制视频.但是,使用手机的相机应用程序,根本没有闪烁/暂停.

此外,只要调用recorder.start(),我的相机预览显示就会调整大小.我不明白为什么会这样.它使预览失真(一切看起来都是压扁和更宽).

我的问题:如何在开始视频录制时阻止闪烁/暂停?如何防止recorder.start()调整预览显示的大小?

每当启用“视频模式”时,立即调用initRecording().一旦用户按下按钮,就会调用startRecording().最后,再次按下该按钮时,将调用stopRecording().不太重要的是,当切换回“图片模式”时,会调用destroyRecorder().

@Override
public void onResume() {

    super.onResume();

    Camera camera = null;
    try {
        camera = Camera.open();
    }
    catch (Exception E) {
        // Camera isn't available
        Toast.makeText( getActivity(),"Camera is not available at this time.",Toast.LENGTH_SHORT ).show();
        getActivity().finish();
        return;
    }

    if ( Build.VERSION.SDK_INT >= Build.VERSION_CODEs.GINGERBREAD ) {
        setCameraDisplayOrientation( camera );
    }
    else {
        camera.setDisplayOrientation( 90 );
    }

    setCamera( camera );
    setCameraZoomDisplay( camera );

    if ( getSurfaceHolder() != null ) {
        startPreview();

        if ( getMode() == MODE_VIDEO ) {
            initRecording();
        }
    }
}

private void setCameraDisplayOrientation( Camera camera ) {

    CameraInfo info = new CameraInfo();
    Camera.getCameraInfo( 0,info );

    int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
    int degrees = 0;
    switch (rotation) {
        case Surface.ROTATION_0:
            degrees = 0;
            break;
        case Surface.ROTATION_90:
            degrees = 90;
            break;
        case Surface.ROTATION_180:
            degrees = 180;
            break;
        case Surface.ROTATION_270:
            degrees = 270;
            break;
    }

    int result = ( info.orientation - degrees + 360 ) % 360;
    camera.setDisplayOrientation( result );
}

private void initRecording() {

    MediaRecorder recorder = new MediaRecorder();
    setRecorder( recorder );

    Camera camera = getCamera();
    camera.unlock();
    recorder.setCamera( camera );

    recorder.setAudiosource( MediaRecorder.Audiosource.MIC );
    recorder.setVideosource( MediaRecorder.Videosource.CAMERa );

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

    String extension;
    switch (cp.fileFormat) {
        case MediaRecorder.outputFormat.MPEG_4:
            extension = "mp4";
            break;
        case MediaRecorder.outputFormat.THREE_GPP:
            extension = "3gp";
            break;
        default:
            extension = "tmp";
    }

    setVideoMimeType( MimeTypeMap.getSingleton().getMimeTypeFromExtension( extension ) );

    File toFile = new File( getActivity().getCacheDir(),"tempvideo.tmp" );
    if ( toFile.exists() ) {
        toFile.delete();
    }
    setTempFile( toFile );

    recorder.setOutputFile( toFile.getPath() );
    recorder.setPreviewDisplay( getSurfaceHolder().getSurface() );

    try {
        recorder.prepare();
        setRecorderInitialized( true );
    }
    catch (IllegalStateException E) {
        e.printStackTrace();
    }
    catch (IOException E) {
        e.printStackTrace();
    }
}

private Boolean startRecording() {

    try {
        getRecorder().start();
        setRecording( true );

        ImageView actionImageView = getActionImageView();
        actionImageView.setImageresource( R.drawable.record_red );
    }
    catch (Exception E) {
        getCamera().lock();
    }

    return true;
}

private void stopRecording() {

    MediaRecorder recorder = getRecorder();
    if ( recorder != null && isRecording() ) {
        recorder.stop();
        setRecording( false );
        setRecorderInitialized( false );

        try {
            insertVideo();
        }
        catch (IOException E) {
            e.printStackTrace();
        }

        initRecording();

        ImageView actionImageView = getActionImageView();
        actionImageView.setImageresource( R.drawable.record_green );
    }
}

private void destroyRecorder() {

    MediaRecorder recorder = getRecorder();
    recorder.release();
    setRecorder( null );
    getCamera().lock();
}

解决方法

@L_444_0@mediaRecorder.start()时轻微缩放的原因是相机调整其预览大小以匹配正在录制的视频的分辨率.可以通过在设置上设置预览和视频重新设置来解决此问题.我想我也找到了一种方法来阻止闪烁,然我发现在使用Camera和MediaRecorder时,一点点滞后或闪烁可能来自任何一个地方,所以这可能是一个有点难以追查. The Android documentation for setting up a camera/video recorder一个开始确保正确设置主要部分的好地方,但我发现有必要深入研究一些类api文档来调试并使体验非常顺利.

Camera.Parameters类是保持流畅视频录制体验的关键.拥有Camera对象后,可以使用Camera.getParameters()获取当前参数来修改它们.然后可以使用Camera.setParameters(Camera.Parameters)来触发已经进行的任何更改.

为防止视频大小调整,我们需要确保参数的预览大小与要录制的视频分辨率一致.要获得支持的视频/预览大小列表,我们可以在当前的Parameters对象上使用Camera.Parameters.getSupportedPreviewSizes(),它将返回Camera.Size对象的列表.这些对象中的每一个都具有width和height属性,可通过Camera.Size.width和Camera.Size.height直接访问(无getter方法). getSupportedPreviewSizes()方法guaranteed to return at least one result,,似乎结果从最高分辨率到最低分配.

(对于API级别> 11,还有一个getSupportedVideoSizes()方法,但看起来这只是设备的某些视频大小与预览大小不同,否则返回null.我没有成功方法,所以我现在坚持使用PreviewSizes,因为它保证返回适合视频和预览的大小,但是要注意向前发展.)

一旦我们拥有与我们想要的视频分辨率相对应的Camera.Size,我们就可以使用Camera.Parameters.setPreviewSize(width,height)设置该大小.另外,为了帮助消除闪烁,我使用了Camera.Parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTinUOUS_VIDEO).执行这些步骤后,使用Camera.setParameters()通知Camera您的更改.在获取相机后,我已成功设置这些参数,因为在用户与此活动交互时设置参数会导致一些延迟.如果你使用相同的视频和图片捕获活动,你也可以在这里设置图片参数,Camera对象将使用适当的参数为每种模式处理.

几乎完成了!现在预览已经完成,剩下的就是确保MediaRecorder使用与预览相同的分辨率.准备媒体记录器时,在@L_444_0@mediaRecorder.setProfile()(或设置编码器,API级别< 8)和MediaRecorder.setOutputFile()之间,使用相同的方法@L_444_0@mediaRecorder.setVideoSize(width,height)值作为预览.现在,使用MediaRecorder.start()从预览到记录的转换应该是无缝的,因为它们都使用相同的分辨率. 这里有一些快速代码片段,因此您可以看到所有内容获取和设置参数:

Camera.Parameters params = camera.getParameters();

params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTinUOUS_VIDEO);

//myVideoSize is an instance of Camera.Size
List<Camera.Size> previewSizes = params.getSupportedPreviewSizes();
myVideoSize = previewSizes.get(0);
params.setPreviewSize(myVideoSize.width,myVideoSize.height);

camera.setParameters(params);

然后在媒体记录器上设置大小:

//After setTing the profile....
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

//Use myVideoSize from above
mediaRecorder.setVideoSize(myVideoSize.width,myVideoSize.height);

//Before setTing the output file
mediaRecorder.setOutputFile(myFilE);

大佬总结

以上是大佬教程为你收集整理的android – 开始视频录制时屏幕闪烁并调整大小全部内容,希望文章能够帮你解决android – 开始视频录制时屏幕闪烁并调整大小所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。