web-dev-qa-db-ja.com

Android正面カメラでビデオを録画できません。MediaRecorderの起動に失敗しました:-19

同じ問題で2つの異なるコードベースがあります。

最初のコードはdeveloper.Android.comから直接コピーしたコードです:http://developer.Android.com/guide/topics /media/camera.html#custom-camera

2番目は次のコードです:

http://Android-er.blogspot.com.au/2011/10/simple-exercise-of-video-capture-using.html

どちらも通常の背面カメラで正常に動作しますが、前面カメラを使用しようとするとすぐにエラーが発生します。

これは次のデバイスで発生します:

  • Nexus S 4.1.2

  • Galaxy Nexus 4.1.2

  • Nexus 7 4.2.1(前面カメラのみ)

複数の異なる記事が異なる文字列キーを参照していますが、一部の人々はいくつかのSamsungおよびHTCデバイスで必要とされる2.2時代のカメラパラメータのように見えるものも試しました。

c = Camera.open(frontFacingCameraID); // attempt to get a Camera instance
Camera.Parameters params = c.getParameters();
params.set("cam-mode", 1);
params.set("cam_mode", 1);
params.set("camera-id", 1);
c.setParameters(params);

これらの機能はどれもありません。Nexus7ではもちろん0である正しい正面カメラIDを検出しています。ただし、結果はすべてのデバイスで同じです。

低品質のプロファイルを使用してみました。ビデオの解像度、エンコーダー、出力形式、ビットレート、フレームレート、ビデオサイズをさまざまな方法で手動で設定しようとしましたが、どれもうまくいきませんでした。

ほとんどのコードには何も問題がないと私に思わせるのは、通常のカメラが正常に動作することです。メディアレコーダーをセットアップするprepareVideoRecorder()/ prepareMediaRecorder()メソッドと関係があるのではないでしょうか。

おそらく、前面カメラで動作することが知られているメディアレコーダーの手動エンコーディング設定ですか?

Android Camera and MediaRecorder APIはうんざりです。iOSと比較すると少し混乱しているだけでなく、断片化されたデバイス全体の恐ろしいparamの非互換性の問題と異なる解像度のいくつかは言うまでもありません。風景。

JBデバイスで動作させることができると仮定すると、これらの問題のほとんどがAPI 15 ICSで解決されているかどうか、経験から誰もが知っていますか?

API 10 Gingerbreadをサポートするのが難しい場合は、サポートしないことを検討します。

23
Madhava Jay

大丈夫なので、ようやく機能するようになります。

この問題は確実に_Profile Settings_、特に_Frame Rate_に関連しているようです。

主要なテストデバイスであるNexus Sで、カメラをプローブすると、次のパラメーターが表示されます。

背面カメラの場合:
15 FPS〜30 FPS、十分に公平.

前面カメラの場合:
7.5 FPS〜30 FPS、大丈夫です。

次に、使用しようとしているプロファイルを確認します。

_CamcorderProfile.QUALITY_HIGH_
_CamcorderProfile.QUALITY_LOW_

QUALITY_LOW:

audioBitRate:12200
audioChannels:1
audioCodec:AMR_NB audioSampleRate:8000
期間:30
fileFormat:THREE_GPP
品質:0
videoBitRate:256000
videoCodec:H264
videoFrameRate:30
videoFrameWidth:176
videoFrameHeight:144

QUALITY_HIGH:

audioBitRate:24000
audioChannels:1
audioCodec:AAC
audioSampleRate:16000
期間:60
fileFormat:MPEG_4
品質:1
videoBitRate:3000000
videoCodec:H264
videoFrameRate:30
videoFrameWidth:720
videoFrameHeight:480

明らかに、高品質プロファイルは背面カメラ用であり、正面が640x480しかないことがわかります。しかし、どちらも30 FPSと述べています。

さて....ここに奇妙さがあります:

背面カメラのフレームレートを設定すると、どのプロファイルでも、恐ろしいものでクラッシュします。

-19エラー

_mediaRecorder.setVideoFrameRate(fpsInt);
_

これは大した問題ではありません。背面カメラについては気にしませんが、プロファイルがデフォルトで30になり、Paramsが15〜30を受け入れると考えると、それは奇妙です。しかし、私が試したint値は機能していません。 setVideoFrameRateを省略しても問題ありません。

とにかく、正面カメラに移動します。

したがって、_QUALITY_LOW_プロファイルを使用し、フレームレートを15以下に設定すると、魔法のように機能します。

_mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoFrameRate(15);
_

実際には、1から15までの値で機能します。奇妙に思えます。

ここに難問があります。解像度を調べて、ほとんどのカメラに適切な解像度を選択することができますが、最低限のVGA 640x480のほとんどすべての正面カメラにもかなり自信があります。

しかし、フレームレートはどうですか? Nexus Sの場合、推測せずに15以下の値を決定する方法がわかりませんか?カメラから返される最低フレームレートを常に使用することを目的とする必要がありますか?

私はGalaxy Nexusを見てみました。3つのフレームレート範囲があり、1つ目は15〜15、2つ目は15〜30です。低品質のプロファイルは、解像度は高くなりますが、似ています。 Galaxy Nexusでロープロファイルを使用すると、問題なく動作するようです。

Nexus 7では、カムコーダープロファイルをプローブできません。これは、変なnullポインターを取得し続けます。 4 FPS-60 FPSをサポートすると書かれています。動作すると思われる_QUALITY_LOW_を選択すると、クラッシュし、動作するフレームレートが見つかりません。エラーはsetProfileに関連していますが、問題は組み込みプロファイルにあると思います。確かにAndroid APIのポイントは一貫しているということです。これは旗艦デバイスであり、ビデオ会議用のFFカメラがありますよね?????

そのため、手動のカスタム設定を使用して2つのデバイスで作業していますが、コードを使用して複数のデバイスで機能させる明確な方法がわかりません。

Nexus Sは、FPSをCamera.getParameters().getSupportedPreviewFpsRange()に従って設定することに関して、約束どおりに動作しないようです。

Auto FPS設定を使用して満足しているが、FFカメラでは使用できないので、どうすればよいですか。カメラが7.5-30 FPSを処理すると言っているにもかかわらず、Nexus SのFPSを明示的に設定する必要があります。この場合は1〜15 FPSの範囲に設定します。

2.xのすべての問題を修正するsetProfileの約束は完全に真実ではなかったようです。

特定のROM=のカメラアプリを作成している場合、その特定のハードウェアに合わせてカスタマイズするだけで、カスタムROMにバグのあるカメラアプリが常にあるように見える理由を説明できるかもしれません。しかし、 ...ダウンロード可能なビデオ録画アプリはどのように機能しますか?それらは各デバイスにカスタムですか?

AndroidにはまだFacebook PokeとTwitter Vineがないのはこのためですか????:P

グーグル、あなたのカメラAPIとは何ですか?

すべての_API 15+_互換デバイスの解像度とフレームレートを決定する「ベストプラクティス」を知っている人はいますか?

それは可能ですか、それともテストする各デバイスでカスタムコードを記述して、残りの部分でサイコロを振るだけですか?

または、Nexus SとNexus 7はただの異常な事故ですか?

25
Madhava Jay

今日も少しこの問題に取り組みました。

まず、権限が正しく設定されていることを確認してください。具体的には、ビデオを録画するには、次のものが必要です。

<uses-feature Android:name="Android.hardware.camera.front" />
<uses-feature Android:name="Android.hardware.microphone"/>

<uses-permission Android:name="Android.permission.CAMERA" />
<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

次に、これは扱いにくい部分です。チュートリアルのこの行は、前面カメラでは機能しません。

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

CamcorderProfile.get()のそのシグネチャは、デフォルトで背面カメラのプロファイルになります。

デバイスの最初の背面カメラのカムコーダープロファイルを指定された品質レベルで返します。デバイスに背面カメラがない場合、これはnullを返します。

代わりに、 http://developer.Android.com/reference/Android/media/CamcorderProfile.html#get(int、%20int) を使用してください。最初のパラメーターは、開いたカメラ、具体的には前面カメラのIDです。

38
spitzanator

フロントカメラではQUALITY_HIGHがサポートされていないため、QUALITY_LOWで試してください。

3
user2157737

私は-19エラーで数時間苦労してきました。私の答えはマダバの応答、特にmCamera.unlock();にあります。

つまり、セットプロファイルに関する最初の回答と組み合わせて、このコードは

        Camera cam = Camera.open(frontCamID);
        cam.unlock();
        recorder.setCamera(cam);

前面カメラから選択して記録できます。

2
Tim Smith

ここを見てください http://developer.Android.com/guide/topics/media/camera.html#capture-video

そこにリストされているコマンドの順序は非常に重要です。

ここから2番目のコード例を使用しました Androidでビデオ録画をキャプチャするにはどうすればよいですか

記録開始機能を変更しました

protected void startRecording() throws IOException 
{
    mrec = new MediaRecorder();  // Works well

    mCamera.setPreviewDisplay(surfaceHolder);
    mCamera.startPreview();

    mCamera.unlock();
    mrec.setCamera(mCamera);

    mrec.setPreviewDisplay(surfaceHolder.getSurface());
    mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mrec.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 

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

    mrec.setOutputFile("/sdcard/zzzz.3gp");
    mrec.setPreviewDisplay(surfaceHolder.getSurface());

    mrec.prepare();
    mrec.start();
}
1
Arkady

私も同じ問題を抱えていました。原因を修正した後、原因は1つだけでした。720×480の解像度がカメラのデフォルトです。私はそれを何にでも変えました、そして、ええ、私はそれをうまく記録することができますか????

1
Ankushkushal