您现在的位置是:首页 > 正文

AVFoundation的介绍

2024-02-01 00:38:50阅读 3

一、简述

AVFoundation是一个OC媒体数据的高级框架。AVFoundation的构建考虑到了目前的硬件环境和应用程序,其设计过程高度依赖多线程机制。充分利用了多核硬件的优势并大量使用block和GCD机制,将复杂的计算机进程放到了后台线程运行。会自动提供硬件加速操作,确保在大部分设备上应用程序能以最佳性能运行。该框架就是针对64位处理器设计的,可以发挥64位处理器的所有优势。

二、AVFoundation的适用范围

这里写图片描述
这里写图片描述

CoreAudio
CoreAudio是Mac OS和ios系统上处理所有音频事件的框架。Core Audio是由多个框架整合在一起的总称,为音频和MIDI内容的录制、播放和处理提供相应接口。Core Audio也提供高层级的接口,比如通过Audio Queue Services框架和所提供的那些接口,主要处理基本的音频播放和录音功能。同时还会提供相对低层次的接口,尤其是Audio Unitis接口。

Core Video
Core Video是Mac OS和ios系统上针对数字视频所提供的普通模式。Core Video为其相对的Core Media提供图片缓存和缓存池支持,提供了一个能够对数字视频逐帧访问的接口。

Core Media
Core Media是AVFoundation所用到的低层级媒体管道的一部分。它提供针对音频样本赫尔视频处理所需的低层级数据类型和接口。Core Media还提供了AVFoundation用到的基于CMTime数据类型的时基模型。CMTime及相关数据类型一般在AVFoundation处理基于时间操作时使用。

三、数字媒体

我们看到的信号标志和所听到的音乐都是通过模拟信号传递给我们的,我们的眼睛和耳朵构造将这些信息转换为我们大脑能够解析出的电信号。现实生活中的信号是连续的,信号的频率和强度是在不断变化的;但是数字世界的信号是离散的,由0和1两个状态表示。要将模拟信号转换成我们能够存储并传输的数字信号,要经过模拟-数字转换过程,我们将这个过程称为采样(Sampling).

3.1数字媒体采样

对媒体内容进行数字化主要有两种方式。第一种称为时间采样,这种方法捕捉一个信号周期内的变化。比如当你在iphone上记录一个音频备忘录时,在录制期间你所有的音高变化和声调变化都会被捕捉下来。第二种采样方式是空间采样,一般用在图片数字化和其它可视媒体内容数字化的过程。

3.2音频采样介绍

当我们记录一个声音时,一般会使用麦克风设备。麦克风设备是将机械能量(声波)转换成(电压信号)的转换设备。目前在用的麦克风种类很多,但是这里讨论的麦克风类型我们称为电动式麦克风。人类可以听到的音频范围是20Hz~20KHz(20 000Hz).

音频数字化的过程包含一个编码方法,称为线性脉冲编码调制(linear pulse-code modulation),比较常见的说法是Linear PCM或LPCM。这个过程采样或测量一个固定的音频信号,过程的周期率被称为采样率。下面是在一秒内对信号进行7次采样及信号的数字化结果图:
这里写图片描述
显然低采样率的数字信号版本无法很好地表现原始数据。下面我们来提高采样频率
这里写图片描述
这次效果显然得到提升,但仍不能准确表示原始信号。不过通过这个示例你可以推测如果不断提高采样的频率,我们就有可能以数字化方式准确表现原始信号的信息。鉴于硬件条件我们还不能复制出完全一样的效果,但是我们能找打一个采样率用于生成足够好的数字呈现效果。我们称其为尼奎斯特频率(Nyquist rate).Harry Nyquist是贝尔实验室的一名工程师,他精确地捕捉到了一个特定频率,该频率为需要采样对象的最高频率的两倍。

除采样率外,数字音频采样的另一个重要方面是我们能够捕捉到什么精度的音频样本。振幅在线性坐标系中进行测量,所以会有Linear PCM这个术语。用于保存样本值的字节数定义了在线性维度上可行的离散度,同时这个信息也被称为音频的位元深度。为每个样本的整体量化分配过少的位结果信息会导致数字音频信号产生噪声和扭曲。使用位元深度为8的方法可以提供256个离散级别数据。对于一些音频资源来说,这个级别的采样率已经足够了,但对于大部分音频内容来说还不够高。CD音质的位元深度为16,可以达到65536个离散级别。专业级别的音频录制环境的位元深度可以达到24或更高。

对信号进行数字化时,如果能够保留原始,未压缩的数字呈现效果,就是该媒体资源最纯粹的数字形式,但这样做需要 大量的存储空间。比如一个44.1KHz、16位LPCM的音频文件每分钟可能要占用10M的空间。

视频文件由一些列称为“帧”的图片组成,在视频文件的时间轴线上每一帧都代表一个场景。要创建一个连续的运动画面,我们需要在短时间间隔内提供特定数量的帧。视频文件一秒钟内所能展现的帧数称为视频帧率,并用FPS作为单位进行测量。常见的帧率为24FPS、25FPS、30FPS。

要知道位压缩的视频内容所需的存储空间,我们首先要确定每个独立的帧有多大。我们知道许多通用的视频尺寸,但是目前视频资源最流行的宽高比为16:9,意思是每16个水平像素对应9个垂直像素。在这一宽高比之下最常见的视频尺寸是1280x720和1920x1080。那么各自的像素情况是什么样的呢?如果对每个像素点使用8为的RGB色彩空间,这就意味着红色占8位,绿色占8位,蓝色占8位。所有的输入收集好后,我们执行一些计算。

颜色 分辨率 帧率 MB/s GB/h
24位 1280x720 30FPS 79MB/s 278GB/h
24位 1920x1080 30FPS 178MB/s 625GB/h

由于大部分情况下对视频进行存储和传输都是不可取的,所以我们需要找到一种方式缩小资源尺寸。

四、数字媒体压缩

4.1、编解码器压缩

大部分音频和视频都是使用编解码器来压缩的。编解码器使用高级压缩算法对需要保存或发送的音频或视频数据进行压缩和编码,同时它还可以将压缩文件解码成适合播放和编辑的媒体资源文件。

编解码器既可以进行无损压缩也可以进行有损压缩,无损压缩编解码器以一种可以完美重构解码的方式对媒体文件进行压缩,十七称为无论编辑还是发布都比较理想的文件。有时也会作为归档文件用。我们经常使用这种压缩方式,比如我们最常用的zip和gzip即是这种方式的压缩。

网站文章

  • excel粘贴时出现故障_Word粘贴时出现“文件未找到:MathPage.WLL”的解决方案

    excel粘贴时出现故障_Word粘贴时出现“文件未找到:MathPage.WLL”的解决方案

    问题:每次装完MathType后,在word里面进行粘贴操作时,总是出现“运行时错误‘53’:文件未找到:MathPage.WLL”。面对这种情况每次都要花点时间找真正的解决方案,然而并不是所有人提供...

    2024-02-01 00:38:43
  • 输出1~n的全排列(递归法) 热门推荐

    #include #include #include #include using namespace std; int a[1000]={0};//保存数列的数组,默认每个位置都是0 int book[1000]={0};//记录一个数有没有在数组里 int n;//1~n void A(int pos)//向a[pos]填数 { if(pos==n+1)//递归边界

    2024-02-01 00:38:14
  • oracle commit提交到底作了什么

    oracle commit所作的工作如下:1,产生一个scn 与此事务相关联的undo tablespace的itl标志为提交即flag为-c--; 并且为此事务分配一个唯一的scn并记录到undo tablespace的事...

    2024-02-01 00:38:07
  • JAVA继承和多态详细讲解

    JAVA继承和多态详细讲解

    面向对象编程的重要知识:继承和多态。通过类的继承机制,可以使用已有的类为基础派生出新类,无需编写重复的程序代码,很好地实现程序代码复用。多态是面向对象编程中继封装和继承之后的另一大特征,它具体是指同一...

    2024-02-01 00:37:38
  • Java二进制小数表示_《Java编程的逻辑》笔记9--小数的二进制表示

    Java二进制小数表示_《Java编程的逻辑》笔记9--小数的二进制表示

    小数计算为什么会出错?简要答案实际上,不是运算本身会出错,而是计算机根本就不能精确的表示很多数,比如0.1这个数。计算机是用一种二进制格式存储小数的,这个二进制格式不能精确表示0.1,它只能表示一个非...

    2024-02-01 00:37:29
  • C#使用OpenCVSharp进行轮廓检测

    在计算机视觉领域中,轮廓检测是一项常见的任务,它可以帮助我们找到图像中的物体边缘或形状边界。在本文中,我们将介绍如何使用C#和OpenCVSharp库实现轮廓检测。在上述代码中,我们首先读取了输入图像...

    2024-02-01 00:37:23
  • 通过PXE服务器批量安装系统

    通过PXE批量部署服务器

    2024-02-01 00:36:56
  • c语言基础局部变量与全局变量

    局部变量1. 在函数内部定义的变量2. 生命周期:从变量定义到函数结束3. 作用域:从变量定义到函数结束全局变量1. 在函数外部定义的变量2. 生命周期:从程序创建到程序销毁(全局变量的地址一旦文件编...

    2024-02-01 00:36:49
  • Android性能优化之-LeakCannary

    Android性能优化之-LeakCannary

    LeakCanary使用 LeakCanary是一个用于Android的内存泄漏检测库.本文从如下四点分析源码 检查哪些内存泄漏 检查内存泄漏的时机 如何判定内存泄漏 如何分析内存泄漏(只有一点点,可...

    2024-02-01 00:36:42
  • Linux 学习记录

    Linux 学习记录

    > 开口朝哪里,哪里的东西输出到另一面,只要有输出就能用管道灌过去 ,>>不覆盖原来内容,追加输入,|还未了解。:为了避免文件行数太多,部分展示,可以用回车一页一页的翻,可以按q中途退出,或者空格全部...

    2024-02-01 00:36:33