1

オーディオなしでビデオを記録するアプリ (API 8) を作成しようとしています。Androidチュートリアルの指示に従いました。私のコードは次のとおりです。

    mCamera.unlock();
    recorder = new MediaRecorder();
    recorder.setCamera(mCamera);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
    recorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
           //getOutputMediaFile returns a file path where the video will be saved
    recorder.setPreviewDisplay(mHolder.getSurface());
    try {
        recorder.prepare();
        recorder.start();
        recording = true;
    } catch (IllegalStateException e) {
        System.out.println("Error preparing recorder");
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println("Error preparing video output");
        e.printStackTrace();
    }

に達するrecorder.start()と、プログラムがクラッシュし、IllegalStateExceptionキャッチできない がエラー コードとともにスローされますstart failed: -12。このエラーコードについて私が見つけた唯一の他の情報はこの投稿にありましたが、それは非常に明確な答えを与えていません。

エラーが何であるかを特定し、解決策を提案できる人はいますか?

4

2 に答える 2

0

だから今、私は例を試して、ソースをダウンロードしました. 私はあなたのコードでそれを変更し、API 8 でサウンドを保存せずに動作します。メイン クラスは次のとおりです。

    public class AndroidVideoCapture extends Activity implements SurfaceHolder.Callback{

Button myButton;
MediaRecorder mediaRecorder;
SurfaceHolder surfaceHolder;
boolean recording;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    recording = false;

    mediaRecorder = new MediaRecorder();
    initMediaRecorder();

    setContentView(R.layout.main);

    SurfaceView myVideoView = (SurfaceView)findViewById(R.id.videoview);
    surfaceHolder = myVideoView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    myButton = (Button)findViewById(R.id.mybutton);
    myButton.setOnClickListener(myButtonOnClickListener);
}

private Button.OnClickListener myButtonOnClickListener 
= new Button.OnClickListener(){

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        if(recording){
            mediaRecorder.stop();
            mediaRecorder.release();
            finish();
        }else{
            mediaRecorder.start();
            recording = true;
            myButton.setText("STOP");
        }
    }};

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
    // TODO Auto-generated method stub
    prepareMediaRecorder();
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
    // TODO Auto-generated method stub

}

private void initMediaRecorder(){

    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
    mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
}

private void prepareMediaRecorder(){
    mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
    try {
        mediaRecorder.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

あなたのコードとの違いは、このチュートリアルではカメラがインスタンス化されていないことです。MediaRecorder でのみ動作します。もう 1 つの違いは、prepare() メソッドと start() メソッドが分離されていることです。MediaRecorder は、アプリの起動時に初期化され、SurfaceView の作成時に準備され、ボタンのクリックで開始されます。多分あなたもそれらを分離しようとし、カメラを使用しないでください。その方法で試してみて、うまくいったらフィードバックをください。

于 2012-12-01T11:39:52.157 に答える