web-dev-qa-db-ja.com

CamcorderProfile.QUALITY_HIGH解像度は、緑のちらつきビデオを生成します

これまでのところ、これに関する説明はありません。基本的に私は、Samsung Galaxy S2でsetVideoSize()が720 x 480に設定されているときに素晴らしい動作をするビデオ録画クラスを持っています。

CamcorderProfile.QUALITY_HIGHを使用して、さまざまな最高品質の記録プロパティを取得し、それらをクラス内で設定できるように、可能な限り最高の解像度で記録したいと思います。これはファイル形式、ビデオフレームレート、エンコーダー、ビットレートで機能しますが、ビデオサイズをCamcorderProfile(1920 x 1080)から返される幅と高さに設定しようとすると、記録されるビデオは緑のちらつきになります。

720 x 480を720 x 481に変更しても同じことを実行することに気付きました。したがって、解像度が電話でサポートされていない場合にのみ、これが発生すると想定できます。ただし、電話に同梱されているビデオカメラは1920 x 1080で録画でき、優れた録画を実現します。

私はこのような高解像度でしか他のいくつかのパラメーターを別の方法で設定する必要があると想定できますが、それらが何であるかを理解できません。

他の誰かがこの問題を抱えていましたか?

返信ありがとうございます。

33
William Stewart

私は同じ問題を解決しようとしてこの質問に出くわしました。

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

そうしないと、カメラが起動するまでに数秒の遅延が生じます。

Samsungがこのようにカメラを実装した理由については、私にはわかりません。それは確かに開発者フレンドリーではありません!

19
SGS2camera

Samsung Galaxy S2でこれをうまく機能させる方法を以下に示します。ここでの重要なポイントは、カメラパラメーターとレコーダービデオサイズの両方で同じ解像度を設定することです。また、すでに述べた「cam_mode」ハックが必要です。そこで、ユーザーが3つの品質モードから選択できるようにしました:低(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」ハックは中品質と高品質でのみ使用する必要があることに注意してください。そうしないと、低品質モードで緑のちらつきが発生します。また、必要に応じて、他のプロファイル設定をカスタマイズすることもできます。

それが役に立てば幸い。

8
Tvaroh
        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のサイズなどのリストです。

1
user1628121

わかりました、私は多くのバリアントをテストしました、そして唯一のバージョンが実際のデバイスでうまくいくのは:

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

私は過去にこのような同様の問題を経験しました。あなたがやっていることは問題ないようですが、問題をデバッグするのに役立つかもしれないいくつかの提案があります:

サポートされている解像度を選択していることを確認してください

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を使用するため、サーフェスビューが正しく構成されていないと、緑色のフリッカーが表示されます。

新しい解像度をサポートできるビデオビットレートを使用していることを確認してください-ビデオビットレートを上げて、元々設定されていたものの2倍にしてみてください(*これは出力ファイルサイズに大きく影響することに注意してください)

CamcorderProfile.QUALITY_HIGHは、サポートされている最高のカメラ解像度を返します。正しいカメラID(前面と背面)を使用していることを確認してください-おそらく背面カメラが1080pをサポートしていますが、前面カメラはサポートしていませんか?

ヒントが役立つことを願っています!

0
jagsaund