5

カメラアプリを書いていますが、S3に問題があります。記録を開始するたびに、表示がゴミになります(下のスクリーンショットを参照)。次に、記録を停止すると、例外が発生します。

10-02 13:36:31.647: E/MediaRecorder(24283): stop failed: -1007
10-02 13:36:31.647: D/AndroidRuntime(24283): Shutting down VM
10-02 13:36:31.647: W/dalvikvm(24283): threadid=1: thread exiting with uncaught exception (group=0x40c49a68)
10-02 13:36:31.647: E/AndroidRuntime(24283): FATAL EXCEPTION: main
10-02 13:36:31.647: E/AndroidRuntime(24283): java.lang.RuntimeException: stop failed.
10-02 13:36:31.647: E/AndroidRuntime(24283):    at android.media.MediaRecorder.native_stop(Native Method)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at android.media.MediaRecorder.stop(MediaRecorder.java:742)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at com.myapp.android.ui.camera.NewCameraActivity.stopRecording(NewCameraActivity.java:178)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at com.myapp.android.ui.camera.NewCameraActivity.toggleRecording(NewCameraActivity.java:189)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at com.myapp.android.ui.camera.NewCameraActivity.onClick(NewCameraActivity.java:97)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at android.view.View.performClick(View.java:3565)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at android.view.View$PerformClick.run(View.java:14165)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at android.os.Handler.handleCallback(Handler.java:605)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at android.os.Looper.loop(Looper.java:137)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at android.app.ActivityThread.main(ActivityThread.java:4514)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at java.lang.reflect.Method.invokeNative(Native Method)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at java.lang.reflect.Method.invoke(Method.java:511)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
10-02 13:36:31.647: E/AndroidRuntime(24283):    at dalvik.system.NativeStart.main(Native Method)

Galaxy Nexus(4.1)、Galaxy S2、Nexus S、GalaxyTab10.1でアプリをテストしました。それらはすべて正常に動作します。ビデオ録画の開発ガイドラインに従いました。このデバイスが他のデバイスとそれほど異なる理由がわかりません。これが私がデバイスで見ているものです。最初の写真は私が録音を始める前です。2番目の写真は、録音を開始するとどうなるかです。

録音を始める前に

録音開始後

MediaRecorderオブジェクトを準備して開始するための私のコードは次のとおりです。

@Override
public void onClick( View v ) {

    switch (v.getId()) {
        case R.id.camera_action_ImageView:
            int mode = getMode();
            if ( mode == MODE_PHOTO ) {
                focusThenTakePicture();
            }
            else if ( mode == MODE_VIDEO ) {
                toggleRecording();
            }
            break;
    }
}

private void startRecording() {

    if ( prepareRecorder() ) {
        getRecorder().start();
        setRecording( true );
    }
}

@TargetApi( 9 )
private boolean prepareRecorder() {

    Camera camera = getCamera();
    camera.unlock();

    MediaRecorder recorder = new MediaRecorder();
    setRecorder( recorder );
    recorder.setCamera( camera );
    recorder.setAudioSource( MediaRecorder.AudioSource.CAMCORDER );
    recorder.setVideoSource( MediaRecorder.VideoSource.CAMERA );

    CamcorderProfile profile;
    if ( Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD ) {
        profile = CamcorderProfile.get( CamcorderProfile.QUALITY_HIGH );
    }
    else {
        profile = CamcorderProfile.get( getCameraId(), CamcorderProfile.QUALITY_HIGH );
    }
    recorder.setProfile( profile );

    File outputFile = LocalMediaUtil.getOutputMediaFile( LocalMediaUtil.MEDIA_TYPE_VIDEO );
    setRecorderOutputFile( outputFile );
    recorder.setOutputFile( outputFile.toString() );
    recorder.setPreviewDisplay( getPreview().getHolder().getSurface() );

    try {
        recorder.prepare();
    }
    catch (Exception e) {
        camera.lock();
        setRecorder( null );
        return false;
    }

    return true;
}

private void stopRecording() {

    MediaRecorder recorder = getRecorder();
    recorder.stop();
    releaseRecorder();
    setRecording( false );

    LocalMediaUtil.scanMedia( this, getRecorderOutputFile().toString(), 90 );
    setRecorderOutputFile( null );
}

private void toggleRecording() {

    if ( isRecording() ) {
        stopRecording();
    }
    else {
        startRecording();
    }
}

private void releaseRecorder() {

    MediaRecorder recorder = getRecorder();
    if ( recorder != null ) {

        recorder.reset();
        recorder.release();
        setRecorder( null );

        getCamera().lock();
    }
}

編集:つまり、これはCamcorderProfile設定されていることと関係があります。に変更するCamcorderProfile.QUALITY_LOWと、正常に動作しました。では、出力が文字化けしない高解像度ビデオを作成するにはどうすればよいですか?

Edit2:つまり、CamcorderProfile.QUALITY_LOWsetを使用すると、ビデオレコーダーを使用してもエラーは発生しません。ただし、出力ビデオは、上記の文字化けしたスクリーンショットと非常によく似ています。では、何が得られるのでしょうか?

4

3 に答える 3

10

私も同様の問題を抱えていましたが、最終的には、カメラとメディアレコーダーの間でプレビューサーフェスを共有したことが原因であることがわかりました(これが実際に根本的な原因であるかどうかはわかりませんが、API呼び出しからはそのように見えます)。

すでにカメラを開いてプレビュー表示をアタッチしていると想定しているので、その場合は、prepareRecorderメソッドの先頭に次の行を挿入してみてください。

Camera camera = getCamera();
camera.stopPreview();
camera.lock();
camera.release();

camera = Camera.open();
camera.unlock();

また、getCamera()の背後に隠されたフィールドにローカルでカメラを再割り当てする必要がある場合もありますが、残念ながら、指定されたコードスニペットでカメラをどのように実装したかはわかりません。

お役に立てれば。

于 2013-01-14T13:25:38.470 に答える
1

SamsungNoteでも同様の問題が発生しました。私の問題は、プレビューが解像度に設定されていて、録音が別のより大きな解像度(私の電話ではサポートされていない解像度)に設定されていたため、そのように見えました。試してみてください:

recorder.setVideoSize(320, 240);

それが機能する場合、それはあなたの初期解決がサポートされていなかったことを意味します/

于 2013-04-02T09:15:17.967 に答える
0

これは、プレビューの解像度とMediarecorderの解像度が異なるためです(デバイスによって異なる場合がありますが、一部のデバイスでは問題が発生するようです)。

Androidカメラアプリを確認してください。プレビューが停止してから記録が開始されることはありません(これは、フラッシュをオンにしておくことで確認できます。プレビューを停止してから記録を開始すると、フラッシュがオフになってから再びオンになりますが、Androidでは起こらないカメラアプリ)。

ここでの「受け入れられた」答えは、カメラがプレビューサーフェスを解放し、mediarecorderが解像度をmediarecorderの解像度の1つに調整できるためにのみ機能しますが、技術的には正しくありません。

于 2014-06-22T20:27:05.127 に答える