AV Foundation学习笔记一(AVFoundation系统概述)

server/2024/9/23 9:24:20/

下图是AV Foundation在ios和mac os系统中所处的位置。
在这里插入图片描述

  • Core audio框架包含了所有音频相关的处理逻辑。该框架提供了高级接口(比如Audio Queue Services框架用于播放和录制音频)和底层接口(比如audio units用于控制音频信号)
  • Core video框架为数字类型视频提供了流水线的model。
  • Core media被AVFoundation用来作为底层媒体流水线的一部分。Core media提供了用于处理声音采样和视频帧的数据类型和接口,比如CMTime数据类型。
  • Core animation框架是一个动画框架,被用于ios和macos。它内部封装了openGL和openGL ES。

虽然AV Foundation框架提供了100多个类和非常多的protocol和非常多的函数和常量,但是我们可以按照“功能单元”的维度对该框架进行拆分,以便我们更好地理解和掌握。拆分成的“功能单元”有:audio播放和录音(audio playback and recording)、media检测(media inspection)、video播放(video playback)、media捕捉(media capture)、media编辑(media editing)、media处理(media处理)、数字media(digital media)、数字media采样(digital media sampling)、audio采样(audio sampling)、数字media压缩(digital media compression)、色度二次采样(chroma subsampling)、编码压缩(codec compression)、video编码(video codec)、h264、audio编码(audio codec)、AAC、容器格式(container formats)。

功能单元1:Audio playback and recording

下图的红框所示的是苹果早期提供的关于audio的接口。比如AVAudioPlayer和AVAudioRecorder提供了一些关于声音播放和录制的简便接口。当然,并不只有这两个类提供了操作音频的功能,AVFoundation框架的其它类也能提供类似功能。
在这里插入图片描述

功能单元2:Media inspection

AVFoundation提供了media资源的检查接口,即你不仅可以通过接口知道某个media资源是否能播放、是否能被编辑、是否能被导出,还可以获取到某个media资源的视频时长、创建日期等信息。此外,AVFoundation还提供了AVMetadataItem类来给你读取或者写入media资源相关的元数据,比如album或者artist信息。

功能单元3:Video Playback

AVFoundation提供了名为AVPlayer的播放器,以便让你播放本地或者网络视频。

功能单元4:Media Capture

现在的ios设备都有摄像头,你可以通过AVFoundation提供的名为AVCaptureSession的类来操作摄像头,进而录视频或者音频。

功能单元5:Media Editing

AVFoundation还可以对media资源进行编辑,比如你可以使用其提供的接口来把多条音轨和视轨合并在一起

功能单元6:Media Processing

你可以使用AVAssetReader和AVAssetWriter类来获取或者修改视频帧(video frame)和音频采样(audio samples)。

功能单元7:Digital Media

我们在网上看到的视频和音频、在手机相册里面看到的视频和音频其实都是digital media。media是怎么变成数字化(digital)的呢?在现实世界中,我们肉眼所看到的现实中的景色、耳朵听到的来自自然界发出的声音在到达我们的眼睛或者耳朵之前,都是一种模拟信号,当我们的感官收到这些信号时,我们的感官会把这些模拟信号转化成我们大脑可以识别的脉冲信号,然后把脉冲信号传给大脑,这样大脑就能“体验”到现实世界了。现实世界的信号都是连续的、频率持续变化的,而数字化的信号都是离散的且其状态的值只能为1或者0。采样指的是把模拟信号转换成数字信号的过程。视频由一系列的image(被称为frame)组成,每一个frame都是一张图片。为了给人一种良好的观看体验,视频frame会被快速且连续的播放。每一秒钟所展示的视频frame的数量被称为视频帧率(video’s frame rate),也被称为FPS。视频的常见的帧率一般是24FPS、25FPS、30FPS。
怎么知道一个视频帧(video )的大小?现在的视频帧的宽高比一般都是16:9,即每16个水平像素会对应9个垂直像素。现在的每个视频帧的大小一般都是1280720或者19201080像素,即基于16:9的宽高比例。
那么,每个像素要占用多大的存储空间呢?如果我们使用RGB的颜色空间来表示一个像素的话,那么8个bit用于表示red,8个bit用于表示green,8个bit用于表示blue,一个颜色空间就占用24个bit,即一个像素就占用24个bit,即3个byte。
下图所示的是,一个没被压缩过的、视频帧率是30FPS的视频,且每个像素由RGB颜色空间表示,在不同的分辨率(Resolution)情况下每秒或者每小时所占用的存储空间的大小。
在这里插入图片描述

功能单元8:Digital Media Compression & Codec Compression

从上图可以看出,没被压缩过的视频的占用空间非常大(比如一个视频时长为一小时的且为1280*720像素的视频占用的存储空间是278GB),不利于网络的传输和磁盘的存储,为了解决这个问题,我们会把视频进行压缩,一般都是通过对视频进行编码的方式进行压缩,这种编码方式被称为codec compression。编码器(encoder)使用各种压缩算法来压缩视频或者音频,而解码器(decoder)则要解码 被压缩的视频或者音频,以便让播放器能够播放视频或者编辑视频。

功能单元9:Chroma subsampling

表示视频画面的像素的编码方式有两种,一种是前面提到的RGB编码方式(一个像素由24个bit表示,其中的8个bit用于表示red,8个bit用于表示green,8个bit用于表示blue),另一种则是YUV编码方式。现在的视频一般都会被以一种名为YUV的编码方式所编码,因为这种编码方式能节省存储空间。YUV的实现方式是,把每一个像素拆分为luma channel Y(亮度)和chroma(color)channels UV。下图所示的是,一张图片分别被以luma和chroma channel的方式拆分之后的效果图。从图中可以看出,luma channel方式拆分后的效果图(如下图中间的那张图片所示)还保留着图片的轮廓和细节,但没有彩色效果,而chroma channel方式拆分的效果图(如下图中的最后一张图片所示)丢失了大部分的细节。因为我们的肉眼对亮度(Y)更加敏感,所以聪明的工程师就把每个像素中的部分UV数据给舍弃掉(舍弃的过程被称为chroma subsampling),进而达到保证图片质量的基础上降低图片的占用空间的目的。
在这里插入图片描述

功能单元10:Container formats

我们在电脑或者手机上看到的视频文件的文件后缀名一般是.mp4、.mov等等,虽然我们常常把这些后缀名称为文件的格式,但准确地定义应该是容器的格式(container formats)。container format也被称为metafile format(元文件格式,你可以把它理解为一个文件夹,该文件夹包含了一种或者多种media类型的文件,比如,一个QuickTime文件包含了多种media类型的数据(比如视频、音频、字幕、文件的描述信息)。每种container format都包含了描述其文件的结构的规范说明书(规范说明书里面包含了视频的时长、视频的编码格式、视频的标题、作者信息)。


http://www.ppmy.cn/server/53096.html

相关文章

0000电子技术基础概述

数电 未来课的基础 以前是模块、器件级 现在是 系统级 价格、性能、 技术更新快速的好处:得到了实惠 坏处:工程师需要不断地学习,不变就容易out,要用发展的眼光看待问题 了解基础知识、还要有前沿概念。 理论课、实践课要相结…

CUDA生态系统架构是什么样的?CUDA的技术原理是什么?底层原理是什么?怎么开发相关产品

CUDA生态系统架构是什么样的?CUDA的技术原理是什么?底层原理是什么?怎么开发相关产品 CUDA 生态系统及其技术原理 CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的一种并行计算平台和编程模型&#xf…

linux库函数 gettimeofday() localtime 使用demo

1. 基本说明 /* linux库函数 gettimeofday 1. 头文件#include <sys/time.h> 2. 函数形式int gettimeofday(struct timeval *tv, struct timezone *tz); 3. 返回值Returns 0 on success, or –1 on error 4. 参数tv&#xff1a;虽然tv_usec字段提供微秒级精度&#xff0…

如何使用SQL工具批量执行SQL文件?(以MySQL和SQLynx为例)

目录 1. 配置MySQL数据源 2. 打开 SQL 文件 3. 执行 SQL 文件 4. 检查执行结果 5. SQL文件示例 6. 注意事项 7. 总结 在现代数据库管理和操作中&#xff0c;批量执行 SQL 文件在 MySQL 中显现出其巨大的价值和不可替代的作用。通过将多个 SQL 语句集成在一个文件中进行批…

力扣(2024.06.23)

1. 62——不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&a…

转转游戏MQ重构:思考与心得之旅

文章目录 1 背景1.1 起始之由1.2 重构前现状1.3 问题分析 2 重构2.1 目标2.2 制定方案2.2.1 架构设计2.2.2 实施计划2.2.3 测试计划 2.3 部分细节设计 3. 总结 1 背景 游戏业务自 2017 年启航&#xff0c;至今已近乎走过七个春秋&#xff0c;历经漫长岁月的发展&#xff0c;不…

典型传感器简介及驱动安装

双目视觉传感器 Indemind 传感器简介 INDEMIND M1 是专为开发者提供的一款硬件&#xff0c;采用“双目摄像头IMU”多传感器融合架构与 微秒级时间同步机制&#xff0c;为视觉 SLAM 研究提供精准稳定数据源&#xff0c;以满足 SLAM 研究、导航及 避障开发、视觉动作捕捉开发、…