2016-02-24 3 views
8

Пробовал использовать Ray great tutorial, чтобы исправить проблему ориентации.AVAsset Orientation/Rotation issue

слева - как видео должно выглядеть (портрет), справа - нежелательный результат повернутый

enter image description here

код, используемый

func setUpVideoNew() 
    { 

     let originalVideoTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0] 
     let composition = AVMutableComposition() 
     let videoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: 1) 
     let timeRange = originalVideoTrack.timeRange 
     do { 
      try videoTrack.insertTimeRange(timeRange, ofTrack: originalVideoTrack, atTime: kCMTimeZero) 
     } catch { 

     } 
     let mainInstruction = AVMutableVideoCompositionInstruction() 
     mainInstruction.timeRange = timeRange 

     let firstlayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack) 
     let firstAssetTrack = originalVideoTrack 


     //MARK - Fix Rotation 
     var firstAssetOrientation_ = UIImageOrientation.Up 

     var isFirstAssetPortrait_ = false 

     var firstTransform = videoTrack.preferredTransform; 
     if firstTransform.a == 0 && firstTransform.b == 1.0 && firstTransform.c == -1.0 && firstTransform.d == 0 { 
      firstAssetOrientation_ = UIImageOrientation.Right; 
      isFirstAssetPortrait_ = true; 
     } 
     if (firstTransform.a == 0 && firstTransform.b == -1.0 && firstTransform.c == 1.0 && firstTransform.d == 0) { 
      firstAssetOrientation_ = UIImageOrientation.Left; 
      isFirstAssetPortrait_ = true; 
     } 
     if (firstTransform.a == 1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == 1.0) { 
      firstAssetOrientation_ = UIImageOrientation.Up; 
     } 
     if (firstTransform.a == -1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == -1.0) { 
      firstAssetOrientation_ = UIImageOrientation.Down; 
     } 

     firstlayerInstruction.setTransform(asset.preferredTransform, atTime: kCMTimeZero) 
     mainInstruction.layerInstructions = [firstlayerInstruction] 


     let videoComposition = AVMutableVideoComposition() 
     videoComposition.frameDuration = CMTimeMake(1, 30) 
     videoComposition.instructions = [mainInstruction] 

     var naturalSizeFirst = CGSize() 

     if(isFirstAssetPortrait_){ 
      naturalSizeFirst = CGSizeMake(videoTrack.naturalSize.height, videoTrack.naturalSize.width); 
     } else { 
      naturalSizeFirst = videoTrack.naturalSize; 
     } 
     videoComposition.renderSize = naturalSizeFirst 
     let playerItem = AVPlayerItem(asset: composition) 
     playerItem.videoComposition = videoComposition 
     player = AVPlayer(playerItem: playerItem) 
     let playerLayer = AVPlayerLayer(player: player) 
     print(videoPreview.frame) 
     print(videoPreview.bounds) 
     playerLayer.frame = self.videoPreview.bounds 

     player.play() 
     self.videoPreview.layer.addSublayer(playerLayer) 



    } 

Любые предложения?

+0

Я добавил детали для вашего вопроса. Было бы неплохо, если бы вы могли уточнить, хотите ли вы, чтобы ваши другие взгляды вращались вместе с видео, а также разрабатывали текущее состояние вращения в других представлениях (т. Е. Поворачивается ли остальная часть вашего приложения?). – owlswipe

ответ

1

Если проблема с вращением iPhone в всего приложения: Убедитесь, что ваше приложение имеет правильную поддерживаемый интерфейс ориентацию в вашем файл Info.plist. Вставьте в Info.plist и проверьте нижние два массива (Поддерживаемые интерфейсные ориентиры и Поддерживаемые интерфейсные интерфейсы (iPad). Убедитесь, что они оба имеют все четыре ориентации. Если они этого не делают, наведите указатель мыши на Поддерживаемые интерфейсные ориентации, нажмите стрелку раскрывающегося списка и нажмите на знак +, который появляется над «Поддерживаемые ориентациях интерфейса» и добавить недостающие ориентации. Сделайте то же самое с «» Поддерживаемые ориентациях интерфейса (IPad)»массив.

adding supported interface orientations in Info.Plist

Если это не сработает, это может быть проблема только с видео. epted ответ здесь: How to fix video orientation issue in iOS. И вот отличный способ конвертировать объектив-c в быстрый: https://objectivec2swift.com/#/converter/code.

Если ваше приложение не вращается, и вы хотите только видео, чтобы повернуть:

Поместите это в ваших взглядах вы хотели бы заблокировать в портретном режиме:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
return UIInterfaceOrientationMask.Portrait 
} 

Тогда, в ваше мнение о видео:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
return UIInterfaceOrientationMask.All 
} 

Для хорошей меры - вы можете это на обоих видах, а также:

override func shouldAutorotate() -> Bool { 
return true 
} 

Источник: how to lock portrait orientation for only main view using swift.

+0

Tho Я не хочу, чтобы мое приложение могло вращаться. Это просто предварительный просмотр видео, которому нужно показать видео с префером-преобразованием. –

+0

@RoiMulia Позвольте мне знать, если это поможет! – owlswipe

+0

@RoiMulia Я добавил еще больше; с этим вы должны иметь возможность устанавливать только вид AVAsset для вращения, не позволяя остальной части приложения вращаться. – owlswipe

2

Вы должны зарегистрироваться для получения уведомления, когда в строке состояния меняет ориентацию, например, так:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("statusBarOrientationChange:"), name: UIApplicationDidChangeStatusBarOrientationNotification, object: nil) 

После этого переключатель заявление для этого было бы читать, как это так, для редактирования размеров вашего AVLayer:

switch (UIApplication.sharedApplication().statusBarOrientation){ 
     case .Unknown : 
     case .PortraitUpsideDown : 
     case .Portrait 
     case .LandscapeLeft : 
     case .LandscapeRight : 
    } 

Когда вы дойдете до правильной ориентации, вам нужно будет применить CGAffineTransform так:

asset.transform = CGAffineTransformMake(M_PI * (180)/180.0) 

Надеюсь, это полезно!

+0

Эй, докун. Мое приложение - только портрет. Видео вращается независимо от ориентации экрана: \ –

+0

Я вижу. Вы пробовали зарегистрироваться для уведомлений о ориентации UIDevice? UIDevice проверяет ориентацию независимо от настроек экрана. – dokun1

+0

Видимо проблема заключается в рендеринге и преобразовании. Tho я до сих пор не понял. –