【问题标题】:AVAsset Orientation/Rotation issueAVAsset 方向/旋转问题
【发布时间】:2016-02-24 14:51:24
【问题描述】:

尝试使用Ray great tutorial 解决方向问题。

左 - 视频的外观(纵向),右 - 不需要的旋转结果

使用的代码

   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)



    }

有什么建议吗?

【问题讨论】:

  • 我已为您的问题添加了详细信息。如果您能详细说明您是否希望其他视图与视频一起旋转,以及详细说明其他视图中的当前旋转状态(即您的应用程序的其余部分是否旋转?),那就太好了。跨度>

标签: swift orientation avplayer avasset avplayeritem


【解决方案1】:

您应该注册状态栏何时改变方向的通知,如下所示:

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

之后,为此的 switch 语句将如下所示,用于编辑 AVLayer 的尺寸:

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

当您找到正确的方向时,您需要像这样应用CGAffineTransform

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

希望对您有所帮助!

【讨论】:

  • 嘿多坤。我的应用程序仅是纵向的。无论屏幕方向如何,视频都在旋转:\
  • 我明白了。您是否尝试过注册 UIDevice 方向通知?无论屏幕设置如何,UIDevice 都会检查方向。
  • 显然问题出在 renderSize 和变换上。虽然我还没有弄清楚
  • 视频可以以任何方向录制,因此在录制视频时,您希望它是“向上”正确的方向,但如果您“根据 Apple 错误地握住 iPhone”,则方向可能是“正确的” ”。录制视频的用户控制方向,你最好的选择是如果视频不向上然后自己旋转它,如果需要我可以提供示例代码。
【解决方案2】:

如果问题是在整个应用中旋转 iPhone请确保您的应用在 Info.plist 文件中具有正确的受支持界面方向。进入 Info.plist,并检查底部的两个数组(支持的界面方向支持的界面方向 (iPad)。确保它们都添加了所有四个方向。如果他们这样做了不是,将鼠标悬停在支持的界面方向上,按下拉箭头,然后按出现在“支持的界面方向”上的 + 号并添加任何缺少的方向。对“支持的界面方向 (iPad)”数组执行相同的操作。

如果这不起作用,可能只是视频有问题。在此处查看问题和接受的答案:How to fix video orientation issue in iOS。 这是将objective-c转换为swift的好方法: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

【讨论】:

  • 我不希望我的应用能够旋转。这只是我需要使用 preffer 转换显示视频的视频预览
  • @RoiMulia 让我知道这是否有帮助!
  • @RoiMulia 我添加了更多;有了这个,您应该能够仅将 AVAsset 的视图设置为旋转,而不让应用程序的其余部分旋转。
  • 嘿约翰。抱歉没有回复,不在。不幸的是它没有帮助.. :\
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多