(一)深入了解AVFoundation:框架概述与核心模块解析

(一)深入了解AVFoundation:框架概述与核心模块解析_第1张图片

(一)深入了解AVFoundation:框架概述与核心模块解析-CSDN博客

(二) 深入了解AVFoundation - 播放:AVFoundation 播放基础入门-CSDN博客

(三)深入了解AVFoundation-播放:AVPlayer 进阶 播放状态 & 进度监听全解析_监听 avplayer 播放的进度,结束,等状态变化-CSDN博客

(四)深入理解AVFoundation-播放:高度自定义视频播放器 UI-CSDN博客

(五)深入了解AVFoundation-播放:多音轨、字幕、倍速播放与横竖屏切换-CSDN博客

(六)深入了解AVFoundation-播放:AirPlay、画中画后台播放-CSDN博客

引言

在如今直播、短视频等应用飞速发展的时代,音视频技术已经成为了每个开发者必备的技能之一。随着各大平台对音视频技术需求的增加,大多数公司都在招聘中明确要求具备音视频相关的知识储备或实战经验。特别是在iOS开发中,AVFoundation框架是处理音视频功能的核心工具,它为我们提供了播放、采集、编辑等强大的功能,是每个iOS开发者必备的利器。

本专栏的目标是帮助你深入学习AVFoundation框架,全面掌握其核心功能。在接下来的系列文章中,我们不仅会详细讲解AVFoundation的基本用法,还会通过实际项目中的应用案例,帮助你将所学的知识转化为真实项目的实战经验。
 

通过本系列的学习,你将学会:

  • 构建自己的视频播放器。
  • 构建完全自定义的视频录制功能。
  • 实现完全自定义的二维码扫描功能。
  • 实现视频的拼接、裁剪、音轨的插入删除。
  • 使用图片生成视频。

AVFoundation框架概况

AVFoundation是Apple提供的强大音视频框架,它集成了多种音视频处理功能,帮助开发者轻松实现音视频播放、采集和编辑等操作。在iOS和macOS开发中,AVFoundation成为了音视频相关应用开发的基石。

我们可以将AVFoundation的常用功能粗略分为三大块:

播放(PlayBack)

播放模块主要用于音视频的播放。AVFoundation提供了如AVPlayer和AVPlayerItem等核心类,支持音频和视频的播放。通过AVKit,开发者可以快速实现简单的播放界面,而AVPlayer则提供了更为灵活和定制化的控制。你可以在这里实现包括音频播放、视频播放以及自定义播放控制(如进度条、快进、暂停等功能)。

采集(Capture)

采集模块让你能够通过设备的摄像头和麦克风进行音视频的录制。AVCaptureSession是其核心类,它将不同的输入(如摄像头、麦克风)与输出(如视频数据流、音频数据流)连接起来。借助此模块,你可以实现拍照、视频录制、音频录制等功能。此外,AVFoundation还支持人脸识别、二维码识别等高级特性,能够在采集过程中对画面进行实时分析与处理。

编辑(Editing)

编辑模块是AVFoundation的另一大亮点,它提供了丰富的视频编辑功能,如视频裁剪、拼接、转场、添加水印等。通过AVAsset、AVAssetTrack等类,你可以灵活地处理和编辑视频资源。例如,你可以剪辑视频、合并多个视频片段、为视频添加水印,甚至将一系列图片生成视频。这些功能可以帮助开发者在应用中实现高效的音视频处理和创作。

播放(PlayBack)

AVFoundation为播放提供了很丰富的功能,几乎可以覆盖APP中的所有播放场景。简单点的直接引入AVKit,播放器往页面上一添加,在传入视频的URL几乎就啥也不用管了,一个完整的播放器就出来了。

然后通常来讲,我们都会使用AVPlayer来定制播放器,这样需要用的相关的类和内容会稍微多一点,但是写熟练了之后也很快,况且这个这个播放器的控制组件其实写完基本上就可以一直用了,它也不会有很多代码。

定制播放器的话首先需要用的三个类:

  1. AVPlayer:播放器,核心负责播放暂停啥的。
  2. AVPlayerItem:表示一个可播放的媒体资源。
  3. AVPlayerLayer:用于呈现视频内容的图层。

在实现播放器的时候有几个需要关注的点:

对 AVPlayerItem 的监听:

  • 资源加载状态:通过监听AVPlayerItem的status属性来了解播资源的加载状态,播放是否成功啥的。(包括Unkown、ReadyToPlay、Failed)。
  • 缓冲进度:通过监听AVPlayerItem的loadedTimeRanges属性,获取已缓冲的的时间段。(只能读取,缓冲机制由系统决定)
  • 播放完成:通过监听AVPlayerItem的AVPlayerItemDidPlayToEndTime,监听播放完成,作为一个通用的播放组件监听到之后什么都不要做,直接回调出去。

对AVPlayer的监听:

  • 播放进度:其实这个属性并为我们提供监听机制,是通过定时读取来实现的,AVPlayer提供了一个定时器读取的方法(addPeriodicTimeObserver),我们需要传入读取的时间间隔以及队列通常都是主队列,因为回调进度更新进度条和显示时间都需要在主线程进行。
  • 播放状态:通过监听AVPlayer的timeControlStatus属性,播放、暂停、缓冲中(.playing、.paused、.waitingToPlayAtSpecifiedRate)。

另外最重要的一点,在播放下一个资源,或者说销毁播放器时,需要移除所有正在进行的监听。

尤其在那中可以上下滑动播放的场景中,就像最普遍的抖音啥的那中效果。

在播放阶段的博客中,我们会介绍整个播放器的详细实现步骤,以及在实际的短剧,短视频、动态视频项目中的完整实现方案。

采集(Capture)

视频采集实现起来就比较容易了,最简单的有个UIImageViewController,不过它不属于AVFoundation框架里面的哈,只是说它支持拍照,录制视频,而且实现起来即简单又快速,最主要的是稳定,肯定不会崩溃,基本上可以满足一些基本的头上上传资料上传啥的。

如果需要高度自定义的话就需要用到AVFoundation框架的内容了,但也很容易实现。

主要涉及到的类有下面几个:

  1. AVCaptureSession:视频采集的会话,负责链接输入输出的核心。
  2. AVCaptureDevice:代表设备(摄像头、麦克风)。
  3. AVCaptureDeviceInput:视频、音频的输入输入源,需要将AVCaptureDevice包装成AVCaptureDeviceInput。
  4. AVCaptureOutput:输出源,重点全在这,一会可以单独说一下。
  5. AVCaptureVideoPreviewLayer:用来进行采集的视频预览。

采集的实现流程

所有采集流程全都统一的,不管是拍照,录制视频,还是说二维码识、别人脸识别。

  1. 初始化采集会话。
  2. 配置会话输入(包括视频输入、音频输入),获取输入设备,包装成AVCaptureDeviceInput并添加到会话。
  3. 配置会话输出,创建对应的会话输出并添加到会话。
  4. 启动会话。
  5. 停止会话。

会话输出

常用的会话输出有以下几类:

  1. AVCaptureStillImageOutput:拍摄图片,iOS10之后就不推荐用这个了。
  2. AVCapturePhotoOutput:也是拍摄图片,现在都是使用这个。
  3. AVCaptureMovieFileOutput:录制视频,把采集到的视频编码保存为文件,我们获取到的就直接是编码的视频文件。
  4. AVCaptureMetadataOutput:元数据,包括二维码识别、人脸识别、文字识别啥的都用这个,用的最多的当然是二维码,数据实时输出。
  5. AVCaptureVideoDataOutput:视频帧数据,实时输出CMSampleBuffer,可以直接进行视频处理,或者直接用于推流。
  6. AVCaptureAudioDataOutput:音频数据,也是实时输出CMSampleBuffer,可以进行音频处理,比如采样啥的。

在实现采集是,需要注意的就是:

为了保证 AVCaptureSession 的线程安全性与运行效率,我们通常会自定义一个串行队列,然后在定义的队列中进行采集相关的操作,比如配置会话、启动会话、停止会话、开始采集、停止采集啥的。

一方面可以防止阻塞主线程,另一方面由于串行执行,也防止了并发访问导致的线程安全问题。

在采集的博客部分,会涉及完全自定义的二维码扫描功能、完全自定义的视频录制功能,以及在项目中发布视频动态的录制,主播录制认证视频的完整实现步骤,包括录制,暂停,最大时长,重新录制等等。

编辑(Editing)

AVFoundation为我们提供的编辑功能可以分为两大派系:

基于AVComposition的“简单编辑流”,主要涉及的类包括:

  1. AVAsset/AVURLAsset:表示一个媒体资源。
  2. AVMutableComposition:用来构建合成结构,往这上边添加视频轨道,音频轨道。
  3. AVMutableVideoComposition:用来添加转场、特效、水印啥的。
  4. AVAssetExportSession:用来导出构建好的视频。
  5. AVAssetImageGenerator:用来截取指定时间的图片,这个用的其实最多,在视频编辑时下边那个可视的进度条就是它实现的。

第二种是基于Reader/Writer的“底层操作流”,用于更精细的操作,例如每帧处理、滤镜渲染、实时编码,主要涉及到的类:

  1. AVAssetReader:负责读取原始的媒体数据,也就是解码,读取到的就是CMSampleBuffer。
  2. AVAssetWriter:负责写入处理后的视频/音频,也就是编码。
  3. AVAssetReaderTrackOutput:用于从某个轨道中读取样本。
  4. AVAssetWriterInput:用于写入轨道数据。
  5. AVAssetWriterInputPixelBufferAdaptor:用于写入像素数据,比如带滤镜的视频帧。

这一套对内容的控制就细节多了,包括视频的编码,H264还是啥的,然后视频的宽高。

在编辑的博客中,我们会介绍如何实现视频的拼接,为视频取消音轨,添加音轨,视频转场,以及通过图片生成视频的实现步骤。

结语

AVFoundation是Apple提供的功能强大的音视频处理框架,它几乎涵盖了iOS开发中所有与音视频相关的需求。从播放、采集到编辑,每个模块都有丰富的API和灵活的扩展能力,能够满足从基础到高级的开发需求。

在接下来的系列文章中,我们将深入解析AVFoundation的各个核心模块,结合实际项目中的应用场景,帮助你不仅掌握基础知识,还能积累宝贵的实战经验。无论你是想实现一个简单的视频播放器,还是开发一个具备专业级音视频处理能力的应用,这个专栏都将为你提供系统性的学习路径,让你在音视频开发的道路上更进一步!

你可能感兴趣的:(AVFoundation,架构与实践,AVFoundation,音视频,播放器,二维码扫描,视频编辑,人脸识别)