4

そのため、より大きなアプリケーション用のレコーディング モジュールに取り組んでいます。ほとんどのデバイスで完全に機能しますが、録音を単に拒否する電話機が 1 つあります。

MediaRecorder を使用して記録を開始するたびに、LogCat は、MediaRecorder の開始に失敗し、エラー コード -12 が発生したことを丁寧に教えてくれます。私は、これらのエラー コードの説明を探して、一日のほとんどをインターネットで探し回っています。これまでのところ、私は不運でした。したがって、私は開発者コミュニティの残りの部分に目を向けます。

MediaRecorder start failed -12

これらのエラー コード、具体的には 16、19、22 と 2147483648 というとてつもなく大きな数字について、すでに複数の質問が寄せられていますが、この情報は私の場合は役に立たないことが証明されています。

これらの意味を含むMediaRecorderエラーコードの信頼できるリストがどこにあるか知っている人はいますか? または、全能の Android オラクルが私に何を伝えようとしているのかを説明してください。

前もって感謝します

4

3 に答える 3

4

私の以前の答えは完全ではありませんでした。さらにいじくり回した後、多くのデバイスは、ほとんどのデバイスのデフォルトであると考える設定に非常に敏感であることがわかりましたが、実際には、期待どおりに動作しない多くのデバイスがあり、クラッシュしてさまざまなエラーが発生しますインターネット上で見つけることができないコード。これらのエラー コードの範囲は -12、-19、-21 から -100 などで、これらのエラー コードのほとんどは、以下のヒントを使用して解決できます。以下に調査結果の短いリストを示します。

API 10を実行するHTC ChaChaは、H264 エンコーダーを使用して記録しません。MP4 や H263 を使用して動作するようにしましたが、ビデオはまだ完全に歪んでいます。その解決策は、576*432 を返す Google 独自の「最適なプレビュー」メソッドを使用する代わりに、カメラのプレビュー サイズを 640*480 に設定することでした。このモデルに例外を設定することで、完全に記録することができました。

H264 を使用して記録しようとすると、API 10を実行しているGalaxy Yがクラッシュします。これは MP4 エンコーダーを使用する例外を作成しました。修正しました。

MP4 を使用して記録しようとすると、API 10を実行しているGalaxy Aceがクラッシュし、エラー コード -12 が返されます。このデバイス モデルの H264 エンコーダーを使用して例外を追加すると、問題が解決します。

MP4 エンコーダーを使用して録音しようとすると、API 10を実行しているDesire Zがクラッシュします。エラー -100 (メディア サーバーが停止しました) が表示されました。H264 を使用すると問題が解決します。

if(API >=11){
        if(CamcorderProfile.hasProfile(mCamId, CamcorderProfile.QUALITY_480P)) {
            Log.d(TAG, "API 11+ 480P");
            mMediaRecorder.setProfile(CamcorderProfile.get(mCamId, CamcorderProfile.QUALITY_480P));
            mMediaRecorder.setVideoSize(640, 480);
            mMediaRecorder.setVideoEncodingBitRate(2000000);
        } else {
            Log.d(TAG, "API 11+ LOW");
            mMediaRecorder.setProfile(CamcorderProfile.get(mCamId, CamcorderProfile.QUALITY_LOW));
        }
    } else if (API < 11 && !MODEL.equals("GT-S5830") && !MODEL.equals("vision")){
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        Log.d(TAG, "API 9 device, defaulting");
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mMediaRecorder.setVideoSize(640, 480);
        mMediaRecorder.setVideoEncodingBitRate(2000000);
    } else if ((API < 11) && MODEL.equals("GT-S5830") || MODEL.equals("vision")) {
        //Galaxy Ace and Desire Z
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mMediaRecorder.setVideoSize(640, 480);
        mMediaRecorder.setVideoEncodingBitRate(2000000);
    }

私はひび割れの比喩的な痛みであるより多くのモデルに出くわすに違いありません. そのとき、私はそれらをリストに追加します. 総括する; これらの煩わしく、ほとんど説明のつかないエラー コードに遭遇した場合は、MediaRecorder パラメーターを確認してください。11 未満の API では CamcorderProfile クラスを使用しないことをお勧めします。これらのモデルの多くは、この高品質のインスタンスを使用するとクラッシュするためです。レコーダ ビデオ ファイルに変な緑色が表示されたり、半対角線が画面に表示されたりする場合は、プレビュー サイズをレコーダ ビデオ サイズと一致するように設定してみてください。

Camera.Parameters param = mCamera.getParameters();
param.setPreviewSize(width, height);
mCamera.setParameters( param );
于 2012-08-14T11:27:06.757 に答える
1

私が抱えていた問題の修正を見つけました。すべてのデバイスが高品質の録音をサポートしているわけではありません。私はそれが相対的なものであると仮定しました。つまり、高品質は一定ではなく、そのデバイスで可能な最高の品質でした。

だから私は置き換えました:

`mMediaRecorder.setProfile(CamcorderProfile.get(camId, CamcorderProfile.QUALITY_HIGH));`

と:

`mMediaRecorder.setProfile(CamcorderProfile.get(camId, CamcorderProfile.QUALITY_LOW));`

そしてそれは問題を修正しました。現在残っている唯一のバグは、実行時にクラッシュすることなく、デバイスがサポートする最高品質を定義する方法です。

于 2012-08-08T08:03:21.830 に答える
0

このコードは私のために働いた:)

        camId = Main.mHelper.getFrontFacingCameraId();
        mCamera = Camera.open(camId);

        Camera.Parameters param = mCamera.getParameters();
        param.set( "cam_mode", 1 );     
        mCamera.setParameters(param);
于 2013-03-11T18:03:33.877 に答える