介绍
在项目中需要使用到视频处理的地方可以使用AVFoundation
来完成,类似于用代码类来编辑视频
基础
-
CMTime
资源时间,可以计算-
videoComposition.frameDuration = CMTimeMake(value: 10000, timescale: Int32(10000 * videoTrack.nominalFrameRate))
-
创建
CMTime
,使用CMTimeMake
-
timescale
相当于设置每一秒分为多少段,value
相当于有多少个这样的时间段。上述代码就是设置每一帧的时间
-
-
AVAsset
资源信息-
表示资源信息,这个资源泛指视频、音频、图片等等;其中包含资源轨道、资源时长、资源类型等信息;
-
let asset = AVAsset(url: inputURL)
AVURLAsset
根据URL路径创建的资源,是AVAsset
的子类AVAssetTrack
资源轨道,包括音频轨道和视频轨道-
let videoTracks = asset.tracks(withMediaType: .video)//视频轨道 let audioTracks = asset.tracks(withMediaType: .audio)//音轨
-
AVMutableComposition
包含多个轨道的资源集合,可以添加、删除轨道,可以通过它做视频的组合,添加音频轨道、添加转场等,是视频编辑中最重要的类。 -
AVMutableCompositionTrack
可变轨道用于集合,可以编辑轨道,插入,删除轨道。 -
AVMutableVideoComposition
视频操作指令集合,设置视频信息,添加水印,设置大小等 -
let videoComposition = AVMutableVideoComposition() let width = videoTrack.naturalSize.width let height = videoTrack.naturalSize.height var size = CGSize(width: videoTrack.naturalSize.width, height: videoTrack.naturalSize.height) let preferredTransform = videoTrack.preferredTransform size = size.applying(CGAffineTransform(rotationAngle: atan2(preferredTransform.b, preferredTransform.a))) size = CGSize(width: CGFloat(abs(size.width)), height: CGFloat(abs(size.height))) videoComposition.renderSize = size
-
AVMutableVideoCompositionInstruction
视频操作指令,视频合成中的单个指令。这个指令定义了在特定时间范围内应用于视频帧的一系列变换和动画。 -
AVMutableVideoCompositionLayerInstruction
视频轨道操作指令,需要添加到AVMutableVideoCompositionInstruction
-
AVMutableAudioMix
音频配置 -
AVMutableAudioMixInputParameters
音频操作参数 -
let audioMix = AVMutableAudioMix() let audioParameters = AVMutableAudioMixInputParameters(track: audioTrack) audioParameters.setVolume(1.0, at: .zero) audioMix.inputParameters = [audioParameters]
-
AVPlayerItem
媒体资源管理对象,管理视频的基本信息和状态 -
AVPlayer
视频播放类,本身不显示视频,需创建一个AVPlayerLayer
层,添加到视图 -
AVAssetExportSession
导出资源 -
guard let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality) else { completion?(CompressError.track(message: "exportSession init failed")) return }
其他
-
输出
-
输出格式、路径、视频轨道、音频轨道等可能经过修改与原始的视频资源不同,在输出的时候改变部分需要赋给输出相应的参数。
-
let outputFileType = AVFileType.mp4 exportSession.outputURL = outputURL exportSession.outputFileType = outputFileType exportSession.shouldOptimizeForNetworkUse = true exportSession.videoComposition = videoComposition exportSession.audioMix = audioMix
-
-
音轨不做修改的话,输出默认会将原视频资源的音轨输出。
-