具有修改的分辨率设置的 AVAssetExportSession

Posted

技术标签:

【中文标题】具有修改的分辨率设置的 AVAssetExportSession【英文标题】:AVAssetExportSession with modified resolution settings 【发布时间】:2016-04-19 22:36:02 【问题描述】:

AVAssetExportSession 将预设作为其初始化参数之一:

AVAssetExportSession(asset: AVAsset, presetName: String)

预设是AVAssetExportPreset640x480AVAssetExportPreset1920x1080 等设置。但是,如果我想使用自定义分辨率(例如 250x400)进行编码,有没有办法做到这一点,如果有,怎么做?

【问题讨论】:

你能把你的代码贴在这里吗? 【参考方案1】:

这些导出选项已定义,无法让您使用自定义分辨率进行编码。或者,您可以尝试这种方法

func exportVideo(asset:AVAsset, renderedWidth: CGFloat, renderedHeight: CGFloat, exportCompletionHandler: (() -> Void)?) 
        let videoTrack: AVAssetTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0]

        let videoComposition = AVMutableVideoComposition()
        videoComposition.frameDuration = CMTimeMake(1, 30)
        videoComposition.renderSize = CGSizeMake(renderedWidth, renderedHeight)

        let instruction: AVMutableVideoCompositionInstruction = AVMutableVideoCompositionInstruction.init()
        instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30))

        let transformer: AVMutableVideoCompositionLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack);
        //Apply any transformer if needed
        //

        instruction.layerInstructions = [transformer]
        videoComposition.instructions = [instruction]

        //Create export path
        let exportPath: NSURL = NSURL(fileURLWithPath: "export_path_here")
        //

        let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality)
        exporter?.videoComposition = videoComposition
        exporter?.outputURL = exportPath
        exporter?.outputFileType = AVFileTypeQuickTimeMovie

        exporter?.exportAsynchronouslyWithCompletionHandler( () -> Void in
            //Do sth when finished
            if let handler = exportCompletionHandler 
                handler()
            
        )
    

我希望这会有所帮助。

参考:https://www.one-dreamer.com/cropping-video-square-like-vine-instagram-xcode/

【讨论】:

谢谢,这很有帮助。我了解除此行之外的大部分代码: instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)) 我不了解 CMTime 60/30 的持续时间。你能解释一下吗?【参考方案2】:

您可以使用自定义分辨率,使用 AVAssetWriter 而不是 AVAssetExportSession 进行调查。这个问题这里有一些相关的示例代码Record square video using AVFoundation and add watermark

另一种相当直接的替代方法是查看使用 SDAVssetExportSession https://github.com/rs/SDAVAssetExportSession 这是 AVAssetExportSession 的“插入”替代品,需要一些额外的设置(在内部它只是 AVAssetReader 和 AVssetWriter 的实现,包装看起来像 AVAssetExportSession 但还公开了 videoSettings 和 audiosettings 选项)。

【讨论】:

以上是关于具有修改的分辨率设置的 AVAssetExportSession的主要内容,如果未能解决你的问题,请参考以下文章

Linux 下怎么用命令修改分辨率

如何修改UE4打包后的窗口分辨率大小

怎样设置Linux系统分辨率

Splashtop修改远程电脑的分辨率

suse 11 如何修改分辨率

Mac 修改自定义分辨率开启hidpi方法