NaturalSize AVAsset отличается от видеофайла

У меня большая проблема с проверкой ориентации видео. Есть код, чтобы проверить, находится ли видеофайл в портретном режиме:

private func checkIfVideoIsPortrait(videoURL: NSURL) -> Bool {

    let videoAsset = AVAsset.init(URL: videoURL)
    let videoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
    let size = videoTrack.naturalSize
    let txf = videoTrack.preferredTransform

    let realSize = CGSizeApplyAffineTransform(size, txf)

    print(videoTrack)
    print(txf)
    print(size)
    print(realSize)

    if (size.width == txf.tx && size.height == txf.ty) {
        return false
    } else if (txf.tx == 0 && txf.ty == 0) {
        return false
    } else if (txf.tx == 0 && txf.ty == size.width) {
        return true
    } else {
        return true
    }
}

У меня есть два видеофайла: 1080x1920 и 360x640. Дело в том, что код возвращает разные размеры файлов, и я не мог распознать ориентацию видео.

Есть логи:

‹ AVAssetTrack: 0x157dee9a0, trackID = 2, mediaType = видео >

CGAffineTransform(a: 1,0, b: 0,0, c: 0,0, d: 1,0, tx: 0,0, ty: 0,0)

(320,0, 568,0)

(320,0, 568,0)

‹ AVAssetTrack: 0x1593643c0, trackID = 2, mediaType = см. >

CGAffineTransform(a: 0,0, b: 1,0, c: -1,0, d: 0,0, tx: 720,0, ty: 0,0)

(1280,0, 720,0)

(-720,0, 1280,0)

Как правильно проверить размеры видео? Буду рад помощи.


person Dzeremix    schedule 30.06.2016    source источник


Ответы (1)


После многих дней попыток и размышлений о том, как добиться реального естественного размера видео, я изменил свою стратегию.

Прямо сейчас я использую эскиз, созданный из видео, чтобы проверить размеры фильма.

Проблема в AVAssetExportSession. Он уничтожает предпочитаемое преобразование и использует значения ландшафта. Причина может быть скрыта в AVAssetExportPreset640x480.

В Swift 2.0 есть код решения:

func checkIfVideoIsPortrait(videoURL: NSURL) -> Bool {

    let videoAsset = AVAsset.init(URL: videoURL)

    let generator = AVAssetImageGenerator.init(asset: videoAsset)
    let imageRef: CGImageRef!

    do {
        try imageRef = generator.copyCGImageAtTime(kCMTimeZero, actualTime: nil)

        let thumbinal = UIImage.init(CGImage: imageRef)

        if thumbinal.size.width < thumbinal.size.height {
            return true
        } else if thumbinal.size.width > thumbinal.size.height{
            return false
        }

    } catch let error as NSError {
        print("Failed to check video portrait")
        print(error.localizedDescription)
    }
    return false
}
person Dzeremix    schedule 23.07.2016