使用AVFoundation做视频编辑,我们从基础的开始说起,涉及到视频编辑的各个功能模块的单独实现和组合,视频编辑框架的设计。
创新互联公司专注于企业营销型网站、网站重做改版、焦作网站定制设计、自适应品牌网站建设、HTML5建站、商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为焦作等各大城市提供网站开发制作服务。
AVFoundation是iOS开发者可以用来播放和创建基于时间的视听媒体的几个框架之一,其提供了检查、创建、编辑或重新编码媒体文件的接口,也使得从设备获取的视频实时数据可操纵。下图是AVFoundation在iOS上的体系结构
视频编辑的对象视频资源(AVAsset),包含多条资源轨道(AVAssetTrack),包括视频轨道,音频轨道,字幕等。编辑就是对这些轨道上的资源做处理。
在用AVFoundation做视频编辑的时候,会用到一个可变的资源组合(AVMutableComposition),它是视频资源的描述,组合工具,基类是AVAsset,可以用来编辑、播放、导出。视频编辑过程中的AVMutableComposition就像下图这样,包含多条轨道,每条轨道的视频又可以来自不同的资源。
AVAsset 是一个抽象类和不可变类,定义了媒体资源混合呈现的方式.可以让我们开发者在处理时基媒体提供了一种简单统一的方式,它并不是媒体资源,但是它可以作为时基媒体的容器.
从相册和本地导入视频、音频资源的时候一般会用到他的子类 AVURLAsset ,在初始化 AVURLAsset 之后,其实系统并没有同步加载数据,所以在调用之前需要先加载,或者在初始化 AVURLAsset 的时候带上。
从URL初始化的时候可以这样写:
从相册获取的:
这样我们的资源就加载好了,后续可以直接使用duration等属性了。
在 AVAsset 中重要的就是资源轨道,可以获取到视频,音频等轨道
AVAssetTrack 是资源轨道,后续都称为资源轨道。可能是视频、音频或者字幕等轨道。可以从 AVAsset 中获取到资源的各个轨道。
需要注意的是在获取资源轨道的时候需要保证资源的track已经加载好。
资源轨道的的类型有:
通常我们需要获取的有AVMediaTypeVideo、AVMediaTypeAudio这两种资源轨道,在一个视频资源中,一般会有一条视频轨道,一条音频轨道,也有可能有多条,主要看视频。大多数从相册获取的视频资源的各类型轨道都是只有一条的。
理解了媒体资源和资源轨道之后,我们开始了解视频编辑组合相关的内容:
下图是AVMutableComposition的继承关系图,可以发现AVMutableComposition继承自AVAsset。其实它也是表示的视频资源,不过我们可以通过它做视频的组合,添加音频轨道、添加转场等,是视频编辑中最重要的类。
资源轨道的类继承图如下:
AVMutableComposition 是一个或多个轨道(AVCompositionTrack)的集合,每个轨道会根据时间线存储源媒体的文件信息,比如音频、视频等。
每个轨道由一系列轨道段(track segments)组成,每个轨道段存储源文件的一部分媒体数据,比如 URL、轨道 ID(track identifier)、时间映射(time mapping)等。
我们可以添加个多个AVMutableCompositionTrack,需要指定媒体类型和trackID。
AVMutableComposition合成新视频的流程 如下图
使用AVMutableAudioMix类,你可以在合成中的音轨上执行自定义音频处理
AVMutableAudioMix 可以通过 AVMutableAudioMixInputParameters 指定任意轨道的任意时间段音量。
我们还可以使用 AVMutableVideoComposition 来直接处理 composition 中的视频轨道。处理一个单独的 video composition 时,你可以指定它的渲染尺寸、缩放比例、帧率等参数并输出最终的视频文件。通过一些针对 video composition 的指令(AVMutableVideoCompositionInstruction 等),我们可以修改视频的背景颜色、应用 layer instructions。
这些 layer instructions(AVMutableVideoCompositionLayerInstruction 等)可以用来对 composition 中的视频轨道实施图形变换、添加图形渐变、透明度变换、增加透明度渐变。此外,你还能通过设置 video composition 的 animationTool 属性来应用 Core Animation Framework 框架中的动画效果。
我们可以使用AVVideoCompositing来处理针对视频每一帧做处理,包括添加滤镜、转场等功能,也可以结合GPUImage来做滤镜转场,opengl等来处理每一帧的图片。自由度非常高,我们将在滤镜转场文章中详细介绍
导出的步骤比较简单,只需要把上面几步创建的处理对象赋值给导出类对象就可以导出最终的产品。
CMTime定义是一个C语言的结构体,CMTime是以分数的形式表示时间,value表示分子,timescale表示分母,value/timescale = seconds,flags是位掩码,表示时间的指定状态。在创建时间的时候timescale我们一般选择600。
其中start表示时间的起点,duratin表示时间范围的持续时间。
我们可以使用AVAssetImageGenerator来获取视频的缩略图,我们只需要传入指定的时间即可获取到此时间的缩略图。
我们可以传入指定时间的数组来批量获取缩略图。
实现 iOS开发webrtc 视频通话时录像,截屏推荐ZEGO即构科技,4行代码,30分钟在APP、Web和小程序等应用内实现视频通话、语音通话,互动直播功能。【点击免费试用,0成本启动】
实现 iOS开发webrtc 视频通话时录像,截屏的具体步骤如下:
1.权限申请。
2.引入 WebRTC 库。
3.采集并显示本地视频。
4.信令驱动。
5.创建音视频数据通道。
6.媒体协商。
7.渲染远端视频。
想要了解更多关于webrtc的相关信息,推荐咨询ZEGO即构科技。ZEGO即构科技自主研发的高音质语音视频引擎,能够提供实时清晰的多人语音通话独立自研的语音前处理模块(AEC, NS, AGC)能够提供优于同类竞品的处理效果,支持全带语音处理。良好的抖动缓冲、前向纠错和丢帧补偿技术使引擎适应复杂的网络环境,提供低延时清晰流畅的语音视频通话,在较差网络环境中自适应的找到延时与流畅的最佳契合点。
快进:AVPlayer .rate 1
慢放: 0 AVPlayer .rate 1
快退: AVPlayer .rate 0 (m3u8 不能快退)
MP4:如果快进到了缓存不够的地方:KVC监听 AVPlayerItem .isPlaybackBufferEmpty = yes
快退到头会走通知AVPlayerItemDidPlayToEndTimeNotification
m3u8(静态):快进与MP4格式视频一致,可以10倍 20倍播放。
m3u8(动态):快进到了缓存不够的地方,会走通知AVPlayerItemDidPlayToEndTimeNotification。
备注:使用[AVPlayerItem stepByCount:-24];
将AVPlayerItem 向前或向后移动指定的步数,正数前进,负数后退。 每个步数的大小取决于AVPlayerItem启用的AVPlayerItemTracks对象;
注册监听和通知
本文讲解的是 iOS 视频播放, 支持本地,在线播放. 进度拖动,精准跳转,获取视频的长度等问题
demo 记得点亮 star. 3Q
iOS 视频播放主要使用的类 AVPlayerItem,AVPlayerLayer,AVPlayer
AVPlayerItem: 提供视频信息, 利用视频的 url 创建一个对象.利用 kvo 监听 status,可以获取当前视频的状态.
AVPlayer: 就类似视频的控制者. 可以用来控制视频的播放,暂停,跳转等. 它的创建依赖于AVPlayerItem
AVPlayerLayer: 用于视频的显示. 可以理解成一个 view. 它的创建依赖于AVPlayer
简单总结: AVPlayer控制视频状态, AVPlayerLayer用于显示,AVPlayerItem提供视频信息
获取视频的长度 s
视频精准跳转.拖动 UISlider,监听 value 改变方法如下:
//为什么timescale要设置成 600 CMTime教程
笔者iOS开发工程师,现在很多应用场景下都会用到视频播放技术,当然iOS APP也不例外,这是写这篇文章的背景。
最近我一个同样做iOS工程师的同学说他最近面试了一个人,简历里写着做过视频播放,就问他基本的视频播放原理是什么,结果此人一脸懵逼状什么也没答上来,只是说会用iOS SDK下调用视频播放的几个API。我同学跟我说他就是想问问此人计算机基础怎么样,其实只要应聘者能说出“解码”两个字都会让他满意的,可惜他却什么也没说出来。这又让笔者想起几年前临近大学毕业时同寝室友校招面试时也遇到了同样的问题,他也做过视频播放,人家就问他其中有两个问题,一是如果现在有一种非常奇怪的格式的视频让你播放你该怎么办,他也是懵逼了。二是如果现在有一个1G的超大视频让你播放,你又该怎么办,他直接就傻了,面试自然折戟沉沙了。
事实上仅就iOS APP来讲,要想做出视频播放的功能来,的确是调用 AVFoundation 框架下几个常用的API就可以了,iOS 9 之前常用的是 MPMoviePlayerController ,ios 9 之后推荐使用流播放技术的 AVPlayer ,可是就像常说的API普通的程序员都会调,可是真正有专业基础和想进阶就要知其然还要知其所以然,有专业基础的和半路出家的程序员的最大区别也正在于此,这也就成了本片文章写作的契机,下面这些内容也是笔者整合了一些自己的一些积累,主要来源于我们有合作关系的一家叫保利威视的视频解决方案提供商,希望对大家有帮助,水平有限,有不足之处还请大家不吝赐教。
视音频技术主要包含以下几点:** 封装技术,视频压缩编码技术以及音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。**
视频播放器播放网上的视频文件,需要经过以下几个步骤:** 解协议,解封装,解码视音频,视音频同步**。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。过程如图所示。
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频 数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
注册 AVAudioSession.interruptionNotification 的通知,可以收到播放打断通知。 系统将此通知发布到主线程。
其中userinfo有如下字段:
分began与end,用来表示打断开始与打断结束。
只在打断结束时返回。选项用 shouldResume 来指示:另一个音频会话的中断已结束,应用程序可以恢复其音频会话。
该属性只在打断开始时返回。存在于版本iOS 10.3-14.5。
用于确定这次中断是否由于系统挂起App所致。
获取到的是一个NSNumber表示的Bool。为true表示中断是由于系统挂起,false是被另一音频打断。
该属性只在打断开始时返回。存在于版本iOS 14.5以后,用来代替 AVAudioSessionInterruptionWasSuspendedKey 。
default :因为另一个音频会话被激活,音频中断。(例如后台播着音频,此时播放微信语音)
appWasSuspended :由于APP被系统挂起,音频中断
builtInMicMuted :音频因内置麦克风静音而中断(例如iPad智能关闭套【iPad's Smart Folio】合上)