How to detect if a video file was recorded in portrait orientation, or landscape in iOS

后端 未结 8 1735
孤城傲影
孤城傲影 2020-11-27 02:36

I am using AlAssetsGroup enumerateAssetsAtIndexes to list the assets in the Photos (Camera) app. For a given video asset I want to determine whether it was shot

相关标签:
8条回答
  • 2020-11-27 03:28

    AVAssetImageGenerator

    If you are using AVAssetImageGenerator to generate images from AVAssets, you can simply set the .appliesPreferredTrackTransform property of AVAssetImageGenerator to true and it will return you images from your asset in the correct orientation! :)


    Swift 3

    But to extend on @onmyway133's answer in Swift 3:

    import UIKit
    import AVFoundation
    
    extension AVAsset {
    
    
        var g_size: CGSize {
            return tracks(withMediaType: AVMediaTypeVideo).first?.naturalSize ?? .zero
        }
    
    
        var g_orientation: UIInterfaceOrientation {
    
            guard let transform = tracks(withMediaType: AVMediaTypeVideo).first?.preferredTransform else {
                return .portrait
            }
    
            switch (transform.tx, transform.ty) {
            case (0, 0):
                return .landscapeRight
            case (g_size.width, g_size.height):
                return .landscapeLeft
            case (0, g_size.width):
                return .portraitUpsideDown
            default:
                return .portrait
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-27 03:35

    In my use case I only needed to know if a video is in portrait or not (landscape).

    guard let videoTrack = AVAsset(url: videoURL).tracks(withMediaType: AVMediaTypeVideo).first else {
        return ...
    }
    
    let transformedVideoSize = videoTrack.naturalSize.applying(videoTrack.preferredTransform)
    let videoIsPortrait = abs(transformedVideoSize.width) < abs(transformedVideoSize.height)
    

    This has been tested with both front and rear cameras for all orientation possibilities.

    0 讨论(0)
提交回复
热议问题