我正在使用AVAssetExportSession导出AVAsset,如果未将vIDeoComposition设置为AVAssetExportSession,它可以正常工作.以下代码导出资产没有问题,但由于vIDeoComposition行被注释掉,因此它不会调整大小和裁剪.
self.asset = AVAsset( URL: valIDURL )!if let exportSession = AVAssetExportSession( asset: self.asset,presetname: AVAssetExportPresetAppleProRes422LPCM ) { exportSession.outputURL = exportURL exportSession.outputfileType = AVfileTypeQuickTimeMovIE// exportSession.vIDeoComposition = self.vIDeoComposition // *** problematic line exportSession.timeRange = CMTimeRangeMake( kCMTimeZero,self.asset.duration ) exportSession.exportAsynchronouslyWithCompletionHandler( { () -> VoID in print( "[export completed]" ) })}
但是如果我将vIDeoComposition设置为AVAssetExportSession以通过删除注释来调整大小和裁剪资源,则表达的文件只有调整大小和裁剪的视频的第一帧,而第二帧和后面的帧都是黑帧,而音频导出没有问题.
我设置的vIDeoComposition如下. (在此示例中,渲染大小和仿射变换是固定的,以简化代码)
var vIDeoComposition: AVVIDeoComposition { //--------------- // composition //--------------- let composition = AVMutableVIDeoComposition() composition.renderSize = NSMakeSize( 720,480 ) // fixed size in this example composition.frameDuration = self.asset.duration //--------------- // instruction //--------------- let instruction = AVMutableVIDeoCompositionInstruction() instruction.timeRange = CMTimeRangeMake( kCMTimeZero,self.asset.duration ) //------------------------- // transform instruction //------------------------- let vIDeoTracks = self.asset.tracksWithMediaType( AVMediaTypeVIDeo ) let assetTrack = vIDeoTracks[0] let layerInstruction = AVMutableVIDeoCompositionLayerInstruction( assetTrack: assetTrack ) let transform = CGAffinetransformMake( 1.5,// fixed transform in this example 0.0,0.0,2.0,-100.0,-100.0 ) layerInstruction.settransformRampFromStarttransform( transform,toEndtransform: transform,timeRange: CMTimeRangeMake( kCMTimeZero,self.asset.duration ) ) instruction.layerInstructions = [ layerInstruction ] composition.instructions = [ instruction ] return composition}
如何避免第二帧和后一帧是黑色并成功导出所有调整大小和裁剪的帧?
解决方法 合成的frameDuration属性是每帧的时间间隔 – 即视频的每秒帧数.您当前已将其设置为整个资产轨道的长度,因此一个帧将持续整个轨道的长度.例如,以下代码将您的合成设置为每秒30帧的帧速率:
composition.frameDuration = CMTimeMake(1,30)
理想情况下,您将使用视频轨道的帧速率(AVAssetTrack具有nominalFrameRate属性),如下所示:
composition.frameDuration = CMTimeMake(1,assetTrack.nominalFrameRate)总结
以上是内存溢出为你收集整理的如何在OS X上的Swift中调整大小,裁剪和导出AVAsset?全部内容,希望文章能够帮你解决如何在OS X上的Swift中调整大小,裁剪和导出AVAsset?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)