框架简介
AVFoundation是iOS中用于处理音视频的框架,主要提供的功能有,视屏播放,视屏录制,以及视屏编辑等功能。
概念介绍
AVAsset
AVAsset是AVFoundation框架中抽象类,用来表示音频或者视屏资源,是一组音视频资源的类型,其中比较重要的属性有duration(持续时间),tracks(资源轨道)。
1 | let asset = AVAsset(url: url) |
AVPlayer
An object that provides the interface to control the player’s transport behavior.
1 | let player = AVPlayer(playerItem: <#T##AVPlayerItem?#>)//初始化 |
AVPlayerItem
该类主要是用于管理资源对象,提供播放数据源,旨在表示由AVPlayer播放的资产的呈现状态,并允许观察该状态,它控制着视频从创建到销毁的诸多状态。
1 | let playItem = AVPlayerItem(asset: <#T##AVAsset#>) |
AVPlayerLayer
用于显示视频内容,相当于大屏幕。里面有videoGravity,默认值 AVLayerVideoGravityResizeAspect.
AVAssetTrack
AVAssetTrack是资源轨道,用于获取AVAsset中的资源,并加以处理
1 | //获取视屏资源中的视屏轨道(视屏交叉部分就会有多条轨道,这里只取第一条) |
多条轨道与显示的关系:
AVVideoCompositionInstruction
可以用作每段处理视屏的指令。
AVVideoCompositionLayerInstruction
用于显示界面的layer层,上图中可以看到1.2共存的部分,便会有多个LayerInstruction,就是一个资源中有多个轨道,并且轨道相交的部分就会产生多个LayerInstruction。
AVAssetExportSession
针对AVAsset源对象的内容进行转码,创建一个被指定输出形式的资源。
1 | // MARK: - 导出合成的视频 |
AVMutableComposition
AVAsset的子类,可以用来新建视屏轨道,音频轨道,提取出资源中音频资源,视屏资源。
1 | let composition = AVMutableComposition() |
实战场景
视屏播放
1 | guard let string = Bundle.main.path(forResource: "01_nebula", ofType: "mp4")else{ |
视屏拼接
视屏拼接主要需要一条视频轨道用来存放视屏资源的数据。
1 | func buildVideoTrack() { |
添加水印&添加动画
要想对视屏资源进行添加效果,主要是需要对AVMutableVideoComposition的animationTool属性进行处理。
水印代码
1 |
|
动画代码
1 | //1.overlay |
过渡效果
一段视屏资源播放出来主要是由它在视屏资源轨道中资源来决定的,效果类似于上图。
所以要想实现视屏的过渡效果,主要是需要多条视屏轨道交叉播放,然后对轨道交叉部分做一定的处理,就可以实现视屏的过渡效果。
1 | ///创建两条相交的视屏轨道 |