29

MediaRecorder で動画を録画しています。私のコードは 2.3.3 では正常に動作しますが、4.0.3 では失敗します。

問題は次のとおりです。コード mediaRecorder.stop() は RuntimeExeption をスローします

java.lang.RuntimeException: stop failed.
    at android.media.MediaRecorder.stop(Native Method)

LogCat メッセージ付き

04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007

アップデート

MediaPlayer は、開始直後に (MediaPlayer.OnErrorListener を介して) エラーを報告することがわかりました。エラー コードは 100 (メディア サーバーの停止)、余分な -1007 です。

UPDATE 2 MediaRecorder を準備するコード

            c = Camera.open();

    ...

    // Step 1: Unlock and set camera to MediaRecorder
    camera.unlock();
    mediaRecorder.setCamera(camera);

    // Step 2: Set sources
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    CamcorderProfile profile = CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH);

    // manual set up!

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
    mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
    mediaRecorder.setVideoSize(profile.videoFrameWidth,
            profile.videoFrameHeight);

    mediaRecorder.setAudioChannels(profile.audioChannels);
    mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
    mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);

    mediaRecorder.setAudioEncoder(profile.audioCodec);
    //mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    mediaRecorder.setVideoEncoder(profile.videoCodec);

    // mediaRecorder.setProfile(profile);

    // Step 4: Set output file
    mediaRecorder.setOutputFile("somefile.mp4");

    // Step 5: Set the preview output
    mediaRecorder.setPreviewDisplay(preview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        mediaRecorder.prepare();
    } catch ...
    { release mediaRecorder}

次に、単純に mediaRecorder.start() を呼び出します。ビデオを mp4 形式にエンコードする必要があることに注意してください。このコードは、Samsng Galaxy GIO (android 2.3.3) で動作し、Acer E305 (android 4.0.2) で説明されているように失敗します。

何か案は?ありがとう。

4

6 に答える 6

24

やっと解決しました。この問題は、カメラの実際のプレビューを設定する前にプレビュー サイズを設定していました。プレビュー サイズは、選択したビデオ サイズと等しくなければなりません。

CamcorderProfile profile = [get required profile];

Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(profile.videoFrameWidth,profile.videoFrameHeight);
mCamera.setParameters(parameters);

mCamera.setPreviewDisplay([surface holder]);
mCamera.startPreview();

...

//configure MediaRecorder and call MediaRecorder.start()
于 2013-05-14T12:28:53.217 に答える
16

4.0.3 の MediaRecorder.java の「stop」メソッドのドキュメントを引用します。

記録を停止します。start() の後にこれを呼び出します。記録が停止したら、構築されたばかりであるかのように再度構成する必要があります。stop() が呼び出されたときに有効なオーディオ/ビデオ データが受信されなかった場合、RuntimeException が意図的にアプリケーションにスローされることに注意してください。これは、start() の直後に stop() が呼び出された場合に発生します。障害が発生すると、出力ファイルが適切に構築されないため、アプリケーションはそれに応じて出力ファイルをクリーンアップ (たとえば、出力ファイルを削除) するアクションを実行できます。

そして、MediaPlayer がこの「メディア サーバーが停止しました」と報告しているのも同じ理由によるものです。この問題を引き起こす可能性のある誤解があるかどうかを確認するために、残りのコードを投稿できますか?

于 2013-04-13T10:02:58.620 に答える
0

そのため、API 18 の Android エミュレーターでこのエラーが報告されていることがわかりました (後のバージョンで記録が正常に機能した後)。

私が見つけたのは、インスタンスをCamera.startPreview()初期化して起動を開始する前に呼び出した場合、呼び出し時にログを取得することですが、初期化する前に呼び出した場合、ビデオは正常に記録されるということです。MediaRecorderstop failed: -1007MediaRecorder.stopCamera.stopPreview()MediaRecorder

これが役立つことを願っています

于 2016-10-22T02:27:38.380 に答える
0

MediaRecorderpreparedであるかどうかを確認するための適切な回避策を投稿しましたstartedMediaRecorder.maxAmplitude > 0つまり、何かが記録されているかどうかを確認する必要があります。ゼロより大きくなるまで条件をチェックし続けるヘルパーでこれを処理しています。ここで完全な説明を読む: https://stackoverflow.com/a/66821059/15389960

于 2021-03-26T17:13:40.210 に答える