ios - Swift:方形视频组合

标签 ios swift video crop

我正在按照下面的方形视频合成代码

func completeWithVideoAtURL(input: NSURL) {
    let asset = AVAsset(url: input as URL)
    let output = NSURL(fileURLWithPath: NSHomeDirectory() + "/Documents/Video.mp4")

    let session = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetMediumQuality)!
    session.videoComposition = self.squareVideoCompositionForAsset(asset: asset)
    session.outputURL = output as URL
    session.outputFileType = AVFileTypeMPEG4
    session.shouldOptimizeForNetworkUse = true        
    session.exportAsynchronously(completionHandler: { () -> Void in
        DispatchQueue.main.async(execute: { () -> Void in
            // do something with the output
            print("\(output)")
            PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: output as URL)
            }) { saved, error in
                if saved {
                    print("saved to gallery")
                }
            }
        })
    })
}

func squareVideoCompositionForAsset(asset: AVAsset) -> AVVideoComposition {
    let track = asset.tracks(withMediaType: AVMediaTypeVideo)[0]
    let length = max(track.naturalSize.width, track.naturalSize.height)

    var transform = track.preferredTransform

    let size = track.naturalSize
    let scale: CGFloat = (transform.a == -1 && transform.b == 0 && transform.c == 0 && transform.d == -1) ? -1 : 1 // check for inversion

    transform = transform.translatedBy(x: scale * -(size.width - length) / 2, y: scale * -(size.height - length) / 2)

    let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: track)
    transformer.setTransform(transform, at: kCMTimeZero)

    let instruction = AVMutableVideoCompositionInstruction()
    instruction.timeRange = CMTimeRange(start: kCMTimeZero, duration: kCMTimePositiveInfinity)
    instruction.layerInstructions = [transformer]

    let composition = AVMutableVideoComposition()
    composition.frameDuration = CMTime(value: 1, timescale: 30)
    composition.renderSize = CGSize(width: length, height: length)
    composition.instructions = [instruction]

    return composition
}

squareVideoCompositionForAsset() 函数中,我为 lengthtrack.naturalSize.width 之间取 ma​​x 值& track.naturalSize.height 因为我不想裁剪视频的任何部分。如果我取最小值,对于纵向视频,它会裁剪视频的上部和下部,对于横向视频,它会裁剪视频的左右部分。

  • 对于横向视频,输出没问题

enter image description here

  • 但对于纵向视频,输出如下图

enter image description here

视频偏左。是否可以将视频居中?如果有任何帮助,我们将不胜感激,对于冗长的解释,我们深表歉意。

最佳答案

代替这一行

let scale: CGFloat = (transform.a == -1 && transform.b == 0 && transform.c == 0 && transform.d == -1) ? -1 : 1

我刚用过这个

    var scale = CGFloat()
    if (transform.a == 0 && transform.b == 1 && transform.c == -1 && transform.d == 0) {
        scale = -1
    }
    else if (transform.a == 0 && transform.b == -1 && transform.c == 1 && transform.d == 0) {
        scale = -1
    }
    else if (transform.a == 1 && transform.b == 0 && transform.c == 0 && transform.d == 1) {
        scale = 1
    }
    else if (transform.a == -1 && transform.b == 0 && transform.c == 0 && transform.d == -1) {
        scale = 1
    }

而且效果很好

关于ios - Swift:方形视频组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43558021/

相关文章:

ios - 如何将unichar转换为character

ios - 降低 'Deployment Target' 以查看较旧的模拟器或在更新后检查您的 Apple SDK 路径警告

ios - Swift - 导航按钮显示和隐藏

swift - 为什么我的数据没有使用闭包在 View Controller 之间传递?

ios - 填充 UITableView 的更快方法?

ios - 如何在 Swift 中制作全角 UITextField

html - 导航栏不会在智能手机设备上居中

audio - 在输出中包含来自 FFmpeg 覆盖的音频

video - 如何同步两个具有可变帧率的视频?

video - 如何在GStreamer中一起播放音频和视频?