ios - 前置摄像头中的 AVAssetExportSession 方向错误

标签 ios avassetexportsession

我遇到了仅在前置摄像头中使用 AVAssetExportSession 导出的视频方向错误的问题。我遵循了本教程 https://stackoverflow.com/a/35368649/3764365但我得到了这种情况。我认为这不是错误的方向,图像被切成两半。我尝试更改视频层、渲染层但没有成功。我的代码如下所示。

let composition = AVMutableComposition()
        let vidAsset = AVURLAsset(url: path)

        // get video track
        let vtrack =  vidAsset.tracks(withMediaType: AVMediaTypeVideo)
        // get audi trac

        let videoTrack:AVAssetTrack = vtrack[0]
        _ = videoTrack.timeRange.duration
        let vid_timerange = CMTimeRangeMake(kCMTimeZero, vidAsset.duration)

        var _: NSError?
        let compositionvideoTrack:AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID())

        do {
            try compositionvideoTrack.insertTimeRange(vid_timerange, of: videoTrack, at: kCMTimeZero)

        } catch let error {
            print(error.localizedDescription)
        }

        let compositionVideoTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)

        let audioTrack = vidAsset.tracks(withMediaType: AVMediaTypeAudio)[0]

        do {
            try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, vidAsset.duration), of: audioTrack, at: kCMTimeZero)

        } catch {
            print("error")
        }

        let size = videoTrack.naturalSize


        let parentlayer = CALayer()

        parentlayer.frame = CGRect(x: 0, y: 0, width: size.height, height: size.width)
        let videolayer = CALayer()
        videolayer.frame = CGRect(x: 0, y: 0, width: size.height, height: size.width)
        parentlayer.addSublayer(videolayer)

let layercomposition = AVMutableVideoComposition()
        layercomposition.frameDuration = CMTimeMake(1, 30)
        layercomposition.renderSize = CGSize(width: size.height, height: size.width)

        layercomposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videolayer, in: parentlayer)

        // instruction for watermark
        let instruction = AVMutableVideoCompositionInstruction()
        instruction.timeRange = CMTimeRangeMake(kCMTimeZero, composition.duration)

        let videotrack = composition.tracks(withMediaType: AVMediaTypeVideo)[0] as AVAssetTrack
        let layerinstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videotrack)

        instruction.layerInstructions = [layerinstruction]
        layercomposition.instructions = [instruction]

        layerinstruction.setTransform(videoTrack.preferredTransform, at: kCMTimeZero)

        //  create new file to receive data
        let movieDestinationUrl = UIImage.outPut()

        // use AVAssetExportSession to export video
        let assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPreset1280x720)!
        assetExport.videoComposition = layercomposition
        assetExport.outputFileType = AVFileTypeQuickTimeMovie
        assetExport.outputURL = movieDestinationUrl

最佳答案

movieFileOutputConnection?.isVideoMirroredtrue 设置为 false 为我解决了这个问题。在我看来,这是一个奇怪的错误。

if self.currentCamera == .front {
        movieFileOutputConnection?.isVideoMirrored = false
}

关于ios - 前置摄像头中的 AVAssetExportSession 方向错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43818429/

相关文章:

iphone - Cocoa Touch - 分配中不兼容的类型

ios - 当使用 JSON 在后台加载数组并在 TableView 中进行选举时,事件指示器不会消失

swift - AVAssetExportSession 不导出 M4V 文件

ios - 如何在 AVMutableComposition 中使用多个轨道

ios - AudioFile 修剪不起作用

iOS - 无法部署到 iOS 6.1 模拟器或将部署目标设置为 iOS 6.1

iphone - 如何动态调整 UITableView 单元格的高度

swift - 在 Swift 4 中合并两个视频?

ios - 如何计算所有类被调用的次数

ios - 试图用 `AVAssetExportSession` 分割视频