【问题标题】:CamcorderProfile.QUALITY_HIGH resolution produces green flickering videoCamcorderProfile.QUALITY_HIGH 分辨率产生绿色闪烁视频
【发布时间】:2011-08-29 02:38:29
【问题描述】:

到目前为止,我还没有找到任何解释。基本上我有一个视频录制类,当我的三星 Galaxy S2 上的 setVideoSize() 设置为 720 x 480 时,它的效果非常好。

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

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

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

还有其他人遇到过这个问题吗?

提前感谢您的任何回复。

【问题讨论】:

  • 视频编码格式怎么样?您设置了哪一个,默认应用程序将其设置为什么?您可能还想检查输出格式..
  • 嘿 Ravi,我检查了编码格式。最高格式是它尝试使用的 H264,这会产生绿色闪烁。使用 H263 会阻止绿色闪烁,但会产生质量低得多的视频,明显低于 720 x 480 分辨率的视频。至于输出格式,我会看看它是否能正常工作。干杯。
  • 我只是尝试更改输出格式,但没有帮助。 3gpp 做了同样的事情,任何其他格式都会导致强制关闭。
  • 实际分辨率好像是 - 1920 x 1088。可以查看相机支持的分辨率吗?并从该列表中设置最接近 1080p 的分辨率?
  • 嗨,威尔,我在我的 Galaxy S2 上下载了几个视频录制应用程序,当设置为高设置时,所有这些应用程序都会产生类似于您所描述的内容。看起来有很多平铺的小屏幕,大部分是绿色的,还有一些紫色的。在其中一个应用程序中,它有一个“覆盖分辨率(Galaxy SII)”选项,并且只允许最高 720p 的录制,如前所述。我的朋友有一个 Nexus S,他对应用程序没有任何问题。但它无法以 1080p 录制。我开始认为这是 S2/1080p 问题?

标签: android camera resolution mediarecorder


【解决方案1】:

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

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

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

至于三星为何以这种方式实现相机,我不知道。这肯定对开发者不友好!

【讨论】:

  • 很棒的发现!我一定会尽快检查这个解决方案,看看它是如何工作的。干杯。
  • 我刚刚尝试过,但到目前为止还没有运气。设置 cam_mode 会使预览闪烁并且录制完全失败。 (即使用 setProfile()。
  • 我最近才有时间检查一下,到目前为止它似乎运行良好。在 SGS2 上使用 set("cam_mode", 1) 似乎将其置于高清记录模式,并且正如您提到的使用焦点模式 INFINITY (我使用无穷大,因为它不需要高最低 SDK 版本)。您知道在使用低于 1920 x 1080 的分辨率时是否需要将 cam_mode 设置为其他值?
  • cam_mode 技巧也对我有用。非常感谢。但是,在设置后,我发现相机快照在 S2 上被损坏(以前没有损坏)。我还在调查这个。另外,我没有发现需要 setFocusMode。将做更多的测试来检查这一点。感谢您的帮助!
  • 这在三星 Galaxy S2 2.3 上运行良好,但似乎在 4.0 上崩溃 - 有什么建议吗?降低质量效果很好
【解决方案2】:

以下是我如何在三星 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”破解,否则在低质量模式下会出现绿色闪烁。如果需要,您还可以自定义一些其他配置文件设置。

希望,这有帮助。

【讨论】:

  • 由于某种原因,800x480 模式不再适用于 Galaxy S II 和 Android 4。只需将 800 替换为 640 即可。
  • getParams() 方法在哪里?
  • Tom H,你不需要它 - 这是我的应用程序特定方法,其中包含用户定义的设置。质量就是其中之一。
  • 我明白了!我只是有一个任务让这个工作。希望我事先看到你的答案......节省了一两天;-)
【解决方案3】:
        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 中的尺寸列表和更多内容。

【讨论】:

  • 虽然很有趣,但我不确定这是否完全符合答案。
【解决方案4】:

好的,我测试了许多变体,唯一在真实设备上运行良好的版本是:

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

【讨论】:

    【解决方案5】:

    我过去也遇到过类似的问题。 您正在做的事情似乎很好,但这里有一些可能有助于调试问题的建议:

    确保您选择支持的分辨率

    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 但前置摄像头不支持?

    希望提示有所帮助!

    【讨论】:

    • 那么你是说SurfaceView预览的大小会影响最终输出的视频吗?此外,比特率也是使用 CamcorderProfile.QUALITY_HIGH 配置的,因此它应该是支持的最高比特率。感谢 jagsaund 的帮助,我会弄乱 SurfaceView 的大小,看看会发生什么。
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2011-07-05
    • 2013-03-04
    • 2022-01-27
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多