加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在OS X上的Swift中调整大小,裁剪和导出AVAsset?

发布时间:2020-12-14 04:56:49 所属栏目:百科 来源:网络整理
导读:我正在尝试调整大小并裁剪AVAsset并将其导出到OS X上的 Swift中的电影文件中. 我正在使用AVAssetExportSession导出AVAsset,如果未将videoComposition设置为AVAssetExportSession,它可以正常工作.以下代码导出资产没有问题,但由于videoComposition行被注释掉,
我正在尝试调整大小并裁剪AVAsset并将其导出到OS X上的 Swift中的电影文件中.

我正在使用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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读