2016-10-03 8 views
6

私はデバイスのビデオ入力をキャプチャするコードを作りましたが、今のところうまくいきます。セッションの実行中にAVCaptureMovieFileOutputビデオの方向を変更するにはどうすればよいですか?

- (AVCaptureVideoOrientation) videoOrientationFromCurrentDeviceOrientation { 
    switch ([[UIApplication sharedApplication] statusBarOrientation]) { 
     case UIInterfaceOrientationPortrait: { 
      return AVCaptureVideoOrientationPortrait; 
     } 
     case UIInterfaceOrientationLandscapeLeft: { 
      return AVCaptureVideoOrientationLandscapeLeft; 
     } 
     case UIInterfaceOrientationLandscapeRight: { 
      return AVCaptureVideoOrientationLandscapeRight; 
     } 
     case UIInterfaceOrientationPortraitUpsideDown: { 
      return AVCaptureVideoOrientationPortraitUpsideDown; 
     } 
     case UIInterfaceOrientationUnknown: { 
      return 0; 
     } 
    } 
} 

私は私の出力も変更したいので、私はこれを持って今インターフェースの向きの変更:ここで私は

// add preview layer 
_previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session]; 
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
[self.videoView.layer addSublayer:_previewLayer]; 

// add movie output 
_movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 
[_session addOutput:_movieFileOutput]; 
AVCaptureConnection *movieFileOutputConnection = [_movieFileOutput connectionWithMediaType:AVMediaTypeVideo]; 
movieFileOutputConnection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation]; 

// start session 
[_session startRunning]; 

設定したものです

- (void) updatePreviewLayer { 
    _previewLayer.frame = CGRectMake(0, 0, self.videoView.frame.size.width, self.videoView.frame.size.height); 
    _previewLayer.connection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation]; 
    [_session beginConfiguration]; 
    AVCaptureConnection *movieFileOutpurConnection = [_movieFileOutput connectionWithMediaType:AVMediaTypeVideo]; 
    movieFileOutpurConnection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation]; 
    [_session commitConfiguration]; 
} 

をしかし、うーん、それは動作していません。映画出力時に最初にビデオの向きを設定したように見えますが、それは後で変更することはできません。私が風景モードで撮影を開始してからポートレートに変更すると、ビデオは風景モードでは問題なくなりますが、ポートレートモードは回転します。私がポートレートモードで始めるのは、風景が回転するよりも同じです。

これを行う方法はありますか?

答えて

1

てみ

かどうかを制御ムービーファイルの出力では、 の記録中に、指定された接続のvideoOrientationおよびvideoMirroredプロパティに加えられた変更を反映するサンプルを記録するメタデータトラックが作成されます。

もっと興味深い情報があります。私はそれをすべて読んでいます。

しかし、この方法ではフレームを実際には回転させず、再生時にプレイヤーに指示するためにタイムドメタデータを使用するため、すべてのプレーヤーがこの機能をサポートするわけではありません。 AN場合

:それは契約ブレーカだ場合、あなたはあなたのvideoOrientation変更が実際にどのプレーヤーで正常に再生されますファイルで、その結果、フレームを回転させ、より低いレベルAVCaptureVideoDataOutput + AVAssetWriter組み合わせ、の賛成でAVCaptureMovieFileOutputを放棄することができますAVCaptureVideoDataOutputインスタンスの接続のvideoOrientationプロパティまたはvideoMirroredプロパティが (デフォルト値ではない)に設定されている場合、出力は サンプルバッファが物理的に回転および/または反転することによって、目的のミラーリングと向きが適用されます。

p.s.複数の変更を1つのアトミック更新にバッチするために、1つのプロパティのみを変更している場合は、beginConfiguration/commitConfigurationペアが必要ではないと思います。

1

設定を変更する前にセッションを一時停止しようとしましたか?

[_movieFileOutput setRecordsVideoOrientationAndMirroringChanges:YES asMetadataTrackForConnection:movieFileOutputConnection]; 

この方法のためのヘッダファイルのドキュメントは、それは非常にあなたが探しているもののように聞こえる:あなたはあなたのセッションを開始する前にこれを追加すること

関連する問題