2016-10-03 65 views
6

我已經做了一個捕獲設備視頻輸入的代碼,到目前爲止它工作正常。以下是我已經設置如何在運行會話期間更改AVCaptureMovieFileOutput視頻方向?

// 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]; 

其中:

- (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; 
     } 
    } 
} 

現在,當界面取向的變化我想我的輸出也發生變化,所以我有這樣的:

- (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

嘗試添加此您啓動會話之前:

[_movieFileOutput setRecordsVideoOrientationAndMirroringChanges:YES asMetadataTrackForConnection:movieFileOutputConnection]; 

此方法的頭文件文檔使它聽起來很像你要找的東西:

控制是否電影文件輸出將創建一個定時元數據軌道,用於記錄 反映在記錄 期間對給定連接的videoOrientation和videoMirrored屬性所做的更改的樣本。

這裏還有更多有趣的信息,我都讀過。

但是,這種方法實際上並沒有旋轉你的幀,它使用定時元數據來指示玩家在播放時進行,所以有可能並非所有玩家都會支持這個功能。如果這是一個大忌,那麼你就可以有利於低層AVCaptureVideoDataOutput + AVAssetWriter組合,你的videoOrientation變化實際上旋轉框架放棄AVCaptureMovieFileOutput,導致文件,這些文件在任何播放器正常播放:

如果AVCaptureVideoDataOutput實例的連接的videoOrientation或videoMirrored屬性設置爲 非默認值,輸出通過物理旋轉和/或翻轉 樣本緩衝區來應用所需的鏡像和方向。

p.s.我不認爲你需要beginConfiguration/commitConfiguration對,如果你只是改變一個屬性,因爲這是爲了將多個修改分批爲一個原子更新。

1

您是否嘗試在更改配置之前暫停會話?