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

时间:2011-08-29 02:38:30

标签: android camera resolution mediarecorder

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

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

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

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

还有其他人有这个问题吗?

提前感谢您的回复。

5 个答案:

答案 0 :(得分:19)

我遇到了这个问题,试图解决同样的问题。

在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 );

在mediarecorder中,您可以使用

mediarecorder.setVideoSize(1920, 1080);

虽然现在也可以了:

mediarecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

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

(编辑)您还需要设置

parame.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);

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

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

答案 1 :(得分:8)

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

enum InternalCameraQuality {
    LOW, MEDIUM, HIGH
}

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

// 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);
}

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

希望,这有帮助。

答案 2 :(得分:1)

        List<Size> ls = parameters.getSupportedPreviewSizes();
        Size size = ls.get(1);
        sizes 1 ----------960 720
        sizes 2 ----------800 480
        sizes 3 ----------720 480
        sizes 5 -----------640 384
        sizes 6 ----------576 432
        sizes 7 ----------480 320

这是android中的大小和更多列表。

答案 3 :(得分:1)

好的,我测试了很多变种,唯一适用于真实设备的版本是:

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

// THREE_GPP works well but only on Phones            
//  camcorderProfile.fileFormat = MediaRecorder.OutputFormat.THREE_GPP;

// so better you use MPEG_4 for most Devices and PC
camcorderProfile.fileFormat = MediaRecorder.OutputFormat.MPEG_4;
camcorderProfile.videoCodec = MediaRecorder.VideoEncoder.MPEG_4_SP;

mrec.setProfile(camcorderProfile);

答案 4 :(得分:0)

我过去经历过类似的问题。 你正在做什么似乎没问题,但这里有一些建议可能有助于调试问题:

确保您选择支持的解决方案

int cameraId = 0; // using back facing camera
Camera camera = Camera.open(cameraId);
Camera.Parameters cameraParams = camera.getParameters();
List<Camera.Size> supportedPreviewSizes = cameraParams.getSupportedPreviewSizez();

// find suitable Camera preview size from list and set your CamcorderProfile to use that new size

找到合适的预览尺寸后,请确保重置SurfaceView - 您需要调整其大小以适应宽高比的变化

MediaRecorder API使用SurfaceView,因此如果您的表面视图配置不正确,将导致您看到的绿色闪烁

确保使用支持新分辨率的视频比特率 - 尝试将视频比特率提高到原来设置的两倍(*请注意这会大大影响输出文件大小)

CamcorderProfile.QUALITY_HIGH返回支持的最高相机分辨率。确保您使用正确的摄像机ID(正面和背面) - 也许后置摄像头支持1080p,但前置摄像头不支持?

希望提示有所帮助!