8

カスタム動画アプリを作ってみました。マニフェスト2.2のみ(API 8)の設定を使用して動作します。

すべてうまくいきますが、ポートレートモードのビデオがランスケープモードのビデオと変わらない理由がわかりません。

デバイスの向きの変更を検出するには、surfaceChanged()内でこのコードを使用します

        if (mCamera != null) {

        Camera.Parameters p = mCamera.getParameters();

        try {
            mCamera.stopPreview();
        } catch (Exception e) {
            // TODO: handle exception
        }

        int previewWidth = 0;
        int previewHeight = 0;

        if (mPreviewSize != null) {
            Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
            int rotation = display.getRotation();

            switch (rotation) {
            case Surface.ROTATION_0:
                previewWidth = mPreviewSize.height;
                previewHeight = mPreviewSize.width;
                mCamera.setDisplayOrientation(90);
                break;

            case Surface.ROTATION_90:
                previewWidth = mPreviewSize.width;
                previewHeight = mPreviewSize.height;
                mCamera.setDisplayOrientation(0);
                break;

            case Surface.ROTATION_180:
                previewWidth = mPreviewSize.height;
                previewHeight = mPreviewSize.width;
                mCamera.setDisplayOrientation(270);
                break;

            case Surface.ROTATION_270:
                previewWidth = mPreviewSize.width;
                previewHeight = mPreviewSize.height;
                mCamera.setDisplayOrientation(180);
                break;
            }

            p.setPreviewSize(previewWidth, previewHeight);
            mCamera.setParameters(p);
        }
    try {
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        Log.d(TAG, "Cannot start preview.", e);
    }
}

チャームのように機能します。デバイスの表面変更の向きを回転させて、surfaceChangedを呼び出すと、カメラは適切なDisplayRotationに設定されます。

問題は、ビデオが横向きモードでキャプチャされたのか、縦向きモードでキャプチャされたのかを後で判断する方法です。私が得たように、すべてのビデオは横向きでキャプチャされます。プレビュープロセスにのみ影響するsetDisplayOrientationには依存しません。

また、問題を調査すると、標準のカメラアプリを使用すると、ビデオファイル(MediaInfoに表示)に特別なタグが書き込まれることに気付きました。回転:ポートレートでキャプチャされたビデオの場合は90。

しかし、MediaRecorderクラスはそうではありません。

それが問題のようです。誰かがこれを解決する必要がありますか?

4

2 に答える 2

30

それを見つけた !確かに、プレビューを変更したり、ビデオにタグを付けたりすることはできますが、実際にビデオを変更する方法はありません... (おそらく速度の問題か何か)

camera.setDisplayOrientation(90);

プレビューを回転するには、

recorder.setOrientationHint(90);

ビデオに 90° 回転のタグを付けるには、携帯電話は読み取り時に自動的にビデオを回転させます。

だからあなたがしなければならないのは

            camera = Camera.open();
        //Set preview with a 90° ortientation
        camera.setDisplayOrientation(90);
        camera.unlock();

        holder = getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        recorder = new MediaRecorder();
        recorder.setCamera(camera);
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        recorder.setOutputFile(getVideoFolder()+rnd.nextString()+".mp4");
        recorder.setPreviewDisplay(holder.getSurface());
        //Tags the video with a 90° angle in order to tell the phone how to display it
        recorder.setOrientationHint(90);

        if (recorder != null) {
            try {
                recorder.prepare();
            } catch (IllegalStateException e) {
                Log.e("IllegalStateException", e.toString());
            } catch (IOException e) {
                Log.e("IOException", e.toString());
            }
        }

        recorder.start();

それが役に立てば幸い ;-)

于 2012-12-26T21:21:14.637 に答える