2016-10-30 18 views
1

ビデオをカスタムビューでキャプチャしようとしています。 Camera.setDisplayOrientation(rotation)を使用してビデオを正しい向きで表示できますが、記録されたビデオはまだ横長モードです。ポートレートモードでは、ビデオを正しくキャプチャできません。Android、MediaRecorderをポートレートモードで使用して録画ビデオを回転させる方法

私はhttps://github.com/googlesamples/android-Camera2Videoをテストしましたが、同じ問題もあります。

許可を確認した後、の後にsetCameraOrientation()メソッドを呼び出しています。

private void setCameraOrientation() 
{ 
    int rotation = getRotation(); 
    mCamera.setDisplayOrientation(rotation); 

    Camera.Parameters parameters = mCamera.getParameters(); 
    parameters.setRotation(rotation); 
    mCamera.setParameters(parameters); 
} 

private int getRotation() 
{ 
    Display display = getWindowManager().getDefaultDisplay(); 
    int rotation = 0; 
    switch (display.getRotation()) 
    { 
     case Surface.ROTATION_0: 
      rotation = 90; 
      break; 
     case Surface.ROTATION_90: 
      rotation = 0; 
      break; 
     case Surface.ROTATION_180: 
      rotation = 270; 
      break; 
     case Surface.ROTATION_270: 
      rotation = 180; 
      break; 
    } 
    return rotation; 
} 

これにより、正しい向きでビデオを表示できます。しかし、私がMediaRecorderを停止して保存したファイルをチェックした後、90度回転したビデオのアスペクト比が悪いと思う。私は自分のコンピュータとVideoView要素を持つ別の断片に引っ張って調べました。

private boolean prepareRecorder() 
{ 
    mCamera.lock(); 
    mCamera.unlock(); 
    recorder = new MediaRecorder(); 

    recorder.setCamera(mCamera); 

    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
    if (!mIsMute) 
    { 
     recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
     recorder.setProfile(profile); 
    } 
    else 
    { 
     recorder.setOutputFormat(profile.fileFormat); 
     recorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); 
     recorder.setVideoFrameRate(profile.videoFrameRate); 
     recorder.setVideoEncoder(profile.videoCodec); 
     recorder.setVideoEncodingBitRate(profile.videoBitRate); 
    } 

    recorder.setMaxDuration(maxVideoDuration - videoProgress); 

    String fileName = StorageUtil.sharedUtil().getExternalStorageDir() + File.separator + String.format(
      fileNameFormat, videoCount); 
    recorder.setOutputFile(fileName); 

    recorder.setPreviewDisplay(surfaceHolder.getSurface()); 

    try 
    { 
     recorder.prepare(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     return false; 
    } 

    return true; 
} 

、その後、私はちょうど私がちょうどrecoreder.prepare();recorder.setOrientationHint(90);を試みたが、それは何もしませんちなみにrecorder.start();

を呼び出す:私prepareRecorderの方法があります。私は正しい向きを表示できますが、保存することはできません。

答えて

0

同様の問題が発生しました。ここでは、録音時にローテーションを処理するためのコードを示します。これはカメラのapiではなく、カメラのAPIを使用しています。api:

private void setCameraDisplayOrientation() { 
     android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); 
     android.hardware.Camera.getCameraInfo(mCameraId, info); 
     int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
      case Surface.ROTATION_0: 
       degrees = 0; 
       break; 
      case Surface.ROTATION_90: 
       degrees = 90; 
       break; 
      case Surface.ROTATION_180: 
       degrees = 180; 
       break; 
      case Surface.ROTATION_270: 
       degrees = 270; 
       break; 
     } 

     int result; 
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      result = (info.orientation + degrees) % 360; 
      result = (360 - result) % 360; // compensate the mirror 
     } else { // back-facing 
      result = (info.orientation - degrees + 360) % 360; 
     } 

     Log.d(TAG, "Orientation: " + String.valueOf(result)); 

     mCamera.setDisplayOrientation(result); 
    } 
+0

ご回答ありがとうございますが、これは私の問題ではありません。私はすでに 'setCameraOrientation()'メソッドで表示方向を設定しています。これは私が録画中に正しく表示するのに役立ちますが、私の問題はポートレートモードでビデオを保存することです。 ビデオは常に横長モードで保存されますが、ffmpegを使用してビデオを回転させているため、追加の時間(数秒)がかかります。 Android7.0 OS搭載の一般的なモバイルAndroid Oneでテストしています。 –

+0

なぜffmpegを使ってビデオを回転させていますか?正しいローテーションは、ビデオのメタデータに記録されている必要があります。それは起こっていないのですか? –

+0

ビデオを録画して、次の画面で再生します。回転させないと、ビデオが間違った向きで再生されます。最初はAndroidのプレイヤーと関連があると思っていましたが、私のパソコンに.mp4ビデオを引き込み、結果は同じでした。ビデオは-90度の向きが間違って再生されました。私はffmpegで回転するビデオでのみこの問題を解決できました。 –

0

私は同様のニーズがあります。ポートレートモードは私のために働いた。あなたの対私のコードの唯一の違いは、私は、私は、何とか録画したビデオを今すぐ右の方向性を持っていますが、ちょうどsetDisplayOrientation

// Camera.Parameters parameters = mCamera.getParameters(); // parameters.setRotation(rotation); // mCamera.setParameters(parameters);

カメラ上と mediaRecorder.setOrientationHint(90);

、CameraParametersでの回転を設定していないということです奇妙なメタデータ、正方形のアスペクト比を持っています。だから、もう少し作業が必要です。更新をポストします。

関連する問題