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 = vide >

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 = video >

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. Той унищожава preferredTransform и използва пейзажни стойности. Причината може да е скрита в 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