首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVAsset定向/旋转问题

AVAsset定向/旋转问题
EN

Stack Overflow用户
提问于 2016-02-24 14:51:24
回答 2查看 3.2K关注 0票数 9

尝试使用雷大教程修复定向问题。

左-视频应该怎么看(肖像),右不想要的旋转结果

代码使用

代码语言:javascript
复制
   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)



    }

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2016-03-04 17:58:29

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

代码语言:javascript
复制
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("statusBarOrientationChange:"), name: UIApplicationDidChangeStatusBarOrientationNotification, object: nil)

在此之后,用于编辑AVLayer维度的开关语句将如下所示

代码语言:javascript
复制
    switch (UIApplication.sharedApplication().statusBarOrientation){
        case .Unknown :
        case .PortraitUpsideDown :
        case .Portrait
        case .LandscapeLeft :
        case .LandscapeRight :
    }

当您到达正确的方向时,您将需要应用如下所示的CGAffineTransform

代码语言:javascript
复制
asset.transform = CGAffineTransformMake(M_PI * (180) / 180.0)

希望这能帮上忙!

票数 2
EN

Stack Overflow用户

发布于 2016-02-28 16:54:32

如果问题是在整个app中旋转中的iPhone,请确保应用程序在Info.plist文件中具有正确的支持接口方向。弹出到Info.plist中,检查下面两个数组(支持的接口方向和支持的接口方向(iPad) )。确保他们都增加了所有四个方向。如果没有,鼠标移动到支持的界面方向,按下箭头,然后按下显示在“支持的界面方向”上的+符号,然后添加任何缺失的方向。对“支持的接口方向(iPad)”数组也做同样的操作。

如果这不起作用,--这可能是视频的一个问题。在这里查看问题并接受答案:如何解决iOS中的视频定位问题。这里有一个很好的方法可以将目标-c转换为https://objectivec2swift.com/#/converter/code

如果您的应用程序不旋转,并且希望视频只旋转::

将此放在您的视图中,您希望锁定在纵向模式中:

代码语言:javascript
复制
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
 return UIInterfaceOrientationMask.Portrait
}

然后,在您的视频视图中:

代码语言:javascript
复制
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
 return UIInterfaceOrientationMask.All
}

为了更好地衡量,您可能也希望这两个视图都是这样的:

代码语言:javascript
复制
override func shouldAutorotate() -> Bool {
 return true
}

资料来源:如何快速锁定主视图的纵向定位.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35605402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档