CamcorderProfile.QUALITY_HIGH分辨率产生绿色闪烁视频

Wil*_*art 33 camera android resolution mediarecorder

到目前为止,我还没有找到任何解释.基本上我有一个视频录制课程,当我的三星Galaxy S2上的setVideoSize()设置为720 x 480时,它可以很好地工作.

我希望它以最高分辨率进行录制,因此使用CamcorderProfile.QUALITY_HIGH我可以获得各种最高质量的录制属性并将其设置在我的班级中.这适用于文件格式,视频帧速率,编码器和比特率,但是当我尝试将视频大小设置为CamcorderProfile(1920 x 1080)返回的宽度和高度时,录制的视频只是一个绿色闪烁.

我注意到如果我将720 x 480更改为720 x 481它也做了同样的事情.因此,我只能假设在手机不支持分辨率时会发生这种情况.但是,手机附带的摄像机可以录制1920 x 1080,并且可以录制出色的录像.

我只能假设具有如此高的分辨率,我需要以不同的方式设置其他一些参数,但我无法弄清楚它们可能是什么.

有没有其他人有这个问题?

提前感谢您的回复.

SGS*_*era 20

我试图解决同样的问题时遇到了这个问题.

在xda开发人员http://forum.xda-developers.com/showthread.php?t=1104970&page=8上给出了解决方案.您似乎需要为高清录制设置一个模糊参数"cam_mode"才能工作:

camera = Camera.open();
Camera.Parameters param = camera.getParameters();
param.set( "cam_mode", 1 );     
camera.setParameters( param );
Run Code Online (Sandbox Code Playgroud)

在mediarecorder中,您可以使用

mediarecorder.setVideoSize(1920, 1080);
Run Code Online (Sandbox Code Playgroud)

虽然这现在也有效:

mediarecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
Run Code Online (Sandbox Code Playgroud)

(后者似乎有20Mb/s的视频比特率,所以你可能想要把它降低一点!)我发现我没有必要将预览大小设置为1920x1080.

(编辑)你还需要设置

parame.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
Run Code Online (Sandbox Code Playgroud)

要么

param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
Run Code Online (Sandbox Code Playgroud)

否则你会在相机启动前延迟几秒钟!

至于为什么三星以这种方式实现了相机,我不知道.它肯定不是开发人员友好的!


Tva*_*roh 8

以下是我如何在三星Galaxy S2上完成这项工作.这里的关键点是在摄像机参数和录像机视频大小中设置相同的分辨率.另外,已经提到'cam_mode'hack是必需的.因此,我允许用户从三种质量模式中进行选择:低(800x480),中(1280x720)和高(1920x1080):

enum InternalCameraQuality {
    LOW, MEDIUM, HIGH
}
Run Code Online (Sandbox Code Playgroud)

当我创建/填充相机和录像机时

// signature types are irrelevant here
File start(DeviceHandler handler, FileHelper fh) throws IOException {
    file = fh.createTempFile(".mp4");

    camera = Camera.open();
    setCameraParameters(camera);
    camera.setPreviewDisplay(getHolder());
    camera.unlock();

    recorder = new MediaRecorder();
    recorder.setCamera(camera);
    setRecorderParameters(recorder);

    recorder.prepare();
    recorder.start();

    return file;
}

void setCameraParameters(Camera camera) {
    Camera.Parameters param = camera.getParameters();

    // getParams() simply returns some field holding configuration parameters
    // only the 'quality' parameter is relevant here
    if (getParams().quality != InternalCameraQuality.LOW) {
        // Samsung Galaxy hack for HD video
        param.set("cam_mode", 1);
    }

    Pair<Integer, Integer> resolution = getResolution(getParams().quality);
    param.setPreviewSize(resolution.first, resolution.second);
    param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);

    camera.setParameters(param);
}

void setRecorderParameters(MediaRecorder recorder) {
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    Pair<Integer, Integer> resolution = getResolution(getParams().quality);

    CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
    profile.videoFrameWidth = resolution.first;
    profile.videoFrameHeight = resolution.second;
    recorder.setProfile(profile);

    recorder.setOutputFile(file.getAbsolutePath());
    recorder.setPreviewDisplay(getHolder().getSurface());
}

Pair<Integer, Integer> getResolution(InternalCameraQuality quality) {
    final int width, height;
    switch (quality) {
        case LOW:
            width = 800;
            height = 480;
            break;
        case MEDIUM:
            width = 1280;
            height = 720;
            break;
        case HIGH:
            width = 1920;
            height = 1080;
            break;
        default:
            throw new IllegalArgumentException("Unknown quality: " + quality.name());
    }
    return Pair.create(width, height);
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须仅将"cam_mode"hack用于中等和高质量,否则将在低质量模式下出现绿色闪烁.您也可以根据需要自定义其他一些配置文件设置.

希望,这有帮助.