4

とりわけ、ユーザーからのビデオを記録できるアプリを開発しようとしています。そのため、前面カメラがある場合は、そのカメラでビデオをキャプチャする必要があります。私はカメラのプレビューを作成しましたが、これはうまくいきます。Android ハウツー サイトを使用して MediaRecorder を作成し、セットアップしました。CamcorderProfile を使用すると、start() を呼び出すとメディア サーバーが停止します。自分でエンコーダーをセットアップすると、メディア サーバーが start() で実行時例外をスローし、「開始に失敗しました: -19」というメッセージが表示されます。これは、私が背面カメラを使用していないという事実に関連している可能性があると思います. 適切なコードを作成するための適切なドキュメンタリーが見つからなかったのかもしれません。これは私だけの問題ではないと思います。カメラの使用方法についてもう少し知識を深めていただければ幸いです。私のコードは次のとおりです。

プレビューが設定される onResume()

protected void onResume() {
        super.onResume();
        // 1. set up camera preview
        if(checkCameraHardware(this)){
            mCamera = getCameraInstance();
            mCameraPreview = new CameraPreview(this, mCamera);
            FrameLayout preview = (FrameLayout) findViewById(id.cameraPreview);
            preview.addView(mCameraPreview);
        }
        else{
            Log.d("Recorder", "camera check returned false");
        }
}

使用されたメソッド checkCameraHardware()

private boolean checkCameraHardware(Context context){
    boolean ret = true;
    if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            ret = true;
    }
    else {
        ret = false;
        }
    return ret;
}

メソッド getCameraInstance()

public static Camera getCameraInstance(){
    Camera c = null;
    int cnum = 0;
    mCamSelect = 0;
    Camera.CameraInfo caminfo = new CameraInfo();
    try {
        cnum = Camera.getNumberOfCameras();
        Log.d("getCameraInstance", String.valueOf(cnum));
        for(int i = 0;i<cnum;i++){
            Camera.getCameraInfo(i, caminfo);
            if(caminfo.facing == CameraInfo.CAMERA_FACING_FRONT){
                mCamSelect = i;
                break;
            }
        }
        c = Camera.open(mCamSelect); // attempt to get a Camera instance
    }
    catch (Exception e){
        Log.d("getCameraInstance", "FATAL camera could not be opened");
        // Camera is not available (in use or does not exist)
    }
    if(c==null)Log.d("getCameraInstance", "no camera returned");
    return c; // returns null if camera is unavailable
}

このコード スニペットは、エラーが表示される場所を示しています ( onClick コールバック内)。

if(prepareVideoRecorder()){
    mMediaRecorder.start(); //here the errors occure
    recording = true;
    //start recording
}

MediaRecorder 関連の 3 つのメソッド: prepareVideoRecorder()、releaseMediaRecorder()、および release Camera()

private void releaseMediaRecorder(){
        if (mMediaRecorder != null) {
            mMediaRecorder.reset();   // clear recorder configuration
            mMediaRecorder.release(); // release the recorder object
            mMediaRecorder = null;
            mCamera.lock();           // lock camera for later use
        }
    }

private void releaseCamera(){
    if (mCamera != null){
        mCamera.release();        // release the camera for other applications
        mCamera = null;
    }
}

private boolean prepareVideoRecorder(){

    //ex: mCamera = getCameraInstance();
    mMediaRecorder = new MediaRecorder();

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

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

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)


    CamcorderProfile profile = CamcorderProfile.get(mCamSelect, CamcorderProfile.QUALITY_HIGH);
    if(profile == null){Log.d(tag, "the camcorder profile instance is null");

        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    }else{
        mMediaRecorder.setProfile(profile);
    }



    // Step 4: Set output file
    //ex: mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
    mMediaRecorder.setOutputFile(currentVidFile.getAbsolutePath());

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

    // Step 6: Prepare configured MediaRecorder
    try {
        mMediaRecorder.prepare();
    } catch (IllegalStateException e) {
        Log.d(tag, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        Log.d(tag, "IOException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    }
    return true;
}

public void onGesturePerformed(GestureOverlayView arg0, Gesture arg1) {
    // TODO Auto-generated method stub

}

}

4

2 に答える 2

4

同じ問題を抱えているすべての人を助けるために、私は自分の質問に答えています。エラーは非常にばかげていたので、それを認めるのは少し恥ずかしいです.

オーディオとビデオのソースを準備する際に、間違ったサーフェスをコミットしました。

さまざまな SurfaceView があり、間違った SurfaceView のサーフェスを MediaRecorder にコミットしました。これにより、2 つの異なるソースをサーフェスに接続しようとする試みが発生しましたが、これは不可能であり、メディア サーバーのシャットダウンにつながります。

GalaxyPad 10.1 でアプリをテストしたところ、ビデオ録画は正常に機能しました。Dalvik VM でアプリをテストしましたが、ビデオは白黒ですが動作します。

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

于 2012-10-31T12:34:11.217 に答える
1

マニフェストに次の権限を追加しましたか?

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
于 2012-09-18T09:56:34.023 に答える