音频流格式启用数据流

音频流格式启用数据流

  • 音频流格式启用数据流
    • 使用 AudioStreamBasicDescription 结构
    • 在哪里以及如何设置流格式

音频流格式启用数据流

在单个样本帧级别处理音频数据时,就像使用音频单元一样,仅仅指定正确的数据类型来表示音频是不够的。单个音频样本值中的位布局是有意义的,因此像 Float32 或 UInt16 这样的数据类型不够有表现力。本节将介绍 Core Audio 解决这个问题的方法。

使用 AudioStreamBasicDescription 结构

在应用程序中以及应用程序和音频硬件之间移动音频值的媒介是 AudioStreamBasicDescription 结构:

struct AudioStreamBasicDescription {Float64 mSampleRate;UInt32  mFormatID;UInt32  mFormatFlags;UInt32  mBytesPerPacket;UInt32  mFramesPerPacket;UInt32  mBytesPerFrame;UInt32  mChannelsPerFrame;UInt32  mBitsPerChannel;UInt32  mReserved;
};
typedef struct AudioStreamBasicDescription  AudioStreamBasicDescription;

由于 AudioStreamBasicDescription 这个名字很长,以下缩写为 ASBD。要定义 ASBD 字段的值,请编写类似于下面的代码:

size_t bytesPerSample = sizeof (AudioUnitSampleType);
AudioStreamBasicDescription stereoStreamFormat = {0};stereoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket    = bytesPerSample;
stereoStreamFormat.mBytesPerFrame     = bytesPerSample;
stereoStreamFormat.mFramesPerPacket   = 1;
stereoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
stereoStreamFormat.mChannelsPerFrame  = 2;           // 2 indicates stereo
stereoStreamFormat.mSampleRate        = graphSampleRate;

首先,应该确定采样值的数据类型。此示例使用 AudioUnitSampleType 定义类型,这是大多数音频单元的推荐数据类型。在 iOS 中,AudioUnitSampleType 被定义为 8.24 固定点整数。接下来定义 ASBD 类型变量,初始化为 0 代表不包含任何数据(注意不能跳过该步,否则可能产生一些想不到的问题)。然后就是对变量赋值:

  • mFormatID:格式标识符。例如 kAudioFormatLinearPCM 表示音频单元使用未压缩的音频数据。
  • mFormatFlags:某些 audio unit 使用不规则的音频数据格式即不同的音频数据类型,则该字段需要不同的标志集。例如 3D Mixer unit 需要 UInt16 类型数据作为采样值且 mFormatFlags 需要设置为 kAudioFormatFlagsCanonical。
  • mBytesPerPacket:每个音频包中有多少字节数。
  • mBytesPerFrame:每一帧中有多少字节。
  • mFramesPerPacket:每个包中有多少帧。
  • mFramesPerPacket:每个包中有多少帧。
  • mBitsPerChannel:每个声道有多少位。
  • mChannelsPerFrame:每一帧中有多少声道。
  • mSampleRate:采样率。

在哪里以及如何设置流格式

必须为 audio processing graph 中的关键点设置音频数据流格式。在其他点,系统会设置格式。在其他点上,音频单元连接将流格式从一个音频单元传播到另一个音频单元。

iOS 设备上的音频输入和输出硬件具有系统确定的音频流格式。这些格式总是未压缩的、交错的线性 PCM 格式。该系统在 audio processing graph 中将这些格式强加到 I/O 单元的外向两侧,如图 1-8 所示。

在这里插入图片描述

在图中,麦克风代表输入音频硬件。系统确定输入硬件的音频流格式,并将其强加到远程 I/O 单元输入元素的输入范围内。同样,图中的扬声器代表输出音频硬件。系统确定输出硬件的流格式,并将其强加到远程 I/O 单元输出元素的输出范围上。

应用程序负责在 I/O 单元元素的内侧建立音频流格式。I/O 单元在您的应用程序格式和硬件格式之间执行任何必要的转换。应用程序还负责在 graph 中需要的任何地方设置流格式。在某些情况下,例如在上图的多通道混合器单元的输出中,只需设置部分格式,特别是采样率。

如图 1-8 所示,音频单元连接的一个关键特征是,连接将音频数据流格式从源音频单元的输出传播到目标音频单元的输入。这是一个关键点,因此需要强调:流格式传播通过音频单元连接进行,并且只在一个方向上——从源音频单元的输出到目标音频单元的输入。

流格式传播发生在音频处理图形生命周期的一个特定点,即初始化时。利用格式传播的优势可以显著减少需要编写的代码量。例如,当将多通道混音器单元的输出连接到远程 I/O 单元进行播放时,无需为 I/O 单元设置流格式。

虽然我们可以通过 ASBD 灵活的设置音频数据流的属性,但是建议还是使用当前设备硬件默认使用值。当这样做时,I/O 单元不需要执行采样率转换,这将最大限度地减少功耗,并最大限度地提高了音频质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HandlerMethodArgumentResolver :深入spring mvc参数解析机制

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; 搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到三十…

编程新纪元:AI辅助工具豆包Marscode体验

自从ChatGPT带动全球AI热潮&#xff0c;AI席卷着各行各业。编程界也不例外&#xff0c;早期做过了Github Copilot、阿里的通义灵码等AI编程插件的体验 p.s.以上的下载量与评分均只是plugins.jetbrains的marketplace数据&#xff0c;仅供参考 基本AI编程工具的功能都差不多&…

自然语言处理学习(3)RNN 模型学习---NLP领域的第一个模型

一 基本定义 视频链接 1.小案例理解–语义理解 目的&#xff1a;输入一句话&#xff0c;机器需要理解这句话的语义 二. RNN模型分类 1. 按照输入输出分类 (1) N Vs N (2) N Vs 1 (3) 1 VsN (4) seq2seq 三 传统RNN模型 1. 内部结构分析 &#xff08;a) 总体外…

基于单片机的多功能电子时钟的设计

摘要&#xff1a;提出了一种基于单片机的多功能电子时钟的设计方法&#xff0c;以 AT89C52单片机作为系统的主控芯片&#xff0c;采用DS1302作为时钟控制芯片&#xff0c;实现日期时钟显示并且提供精准定时的功能。此外&#xff0c;还可经由DHT22所构成的温湿度传感电路&#x…

Kafka集群部署(手把手部署图文详细版)

1.1.1 部署zookpeer 在node02下载并解压zookeeper软件包 cd /usr/local wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 或者&#xff1a;scp cat192.168.28.100:/home/cat/zookeeper-3.4.6.tar.gz /tmp&#xff08;注意目录&#xf…

vue属性绑定v-bind

属性绑定v-bind 双大括号不能在HTML attributes 中使用。想要响应式地绑定一个attribute&#xff0c;应该使用v-bind指令。 v-bind 指令指示Vue将元素id attribute 与组件的dyid属性保持一致。如果绑定值是null或者undefined&#xff0c;那么该attribute将会从渲染的元素上移…

昇思第9天

LSTMCRF序列标注 序列标注&#xff1a;对序列进行标注&#xff0c;实际上是对序列中每个Token进行标签预测&#xff0c;可以直接视作简单的多分类问题。但是序列标注不仅仅需要对单个Token进行分类预测&#xff0c;同时相邻Token直接有关联关系&#xff0c;需要引入一种能够学…

docker介绍与详细安装

1 docker 介绍 1.1 虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打破实…

【BUUCTF-PWN】12-get_started_3dsctf_2016

32位&#xff0c;开启了NX保护 执行效果&#xff1a; main函数&#xff1a; 其中gets()函数存在栈溢出&#xff0c;溢出距离为0x38&#xff0c;这里是使用的esp寻址&#xff0c;属于外平栈&#xff0c;不需要覆盖ebp的四个字节。而之前做的题一般都是ebp寻址&#xff0c;…

开发国际短剧系统的策略解析

一、明确项目目标和需求 1、功能需求&#xff1a;确定系统应具备的基本功能&#xff0c;如用户注册、登录、浏览短剧、评论、分享、个性化推荐等。 2、性能需求&#xff1a;确保系统能够承受高并发访问&#xff0c;保证视频流畅播放&#xff0c;减少卡顿和延迟。 3、跨文化传播…

MCU中如何利用串口通信,增加AT指令框架

第一步&#xff0c;通过串口与PC端建立通信第二步&#xff0c;根据PC端发来的AT指令&#xff0c;MCU执行相应代码 主要是解析PC端发来的字符串&#xff0c;也就是获取字符串、处理字符串、以及分析字符串。 1. 串口通信 用到的是DMA串口通信&#xff0c;收发字符串数据时&…

如何使用 3D 建模库在 C# 中将 3DS 转换为 USDZ?

USDZ/USD是一种 3D 文件格式&#xff0c;被广泛用于跨平台共享 3D 资产。另一方面&#xff0c;3DS是另一种以块形式存储数据的 3D 文件格式。在某些情况下&#xff0c;您需要将3DS 文件转换为 USDZ/USD文件格式。因此&#xff0c;本篇博文介绍了一个功能丰富的3D 建模库&#x…

【基于R语言群体遗传学】-6-表型计算等位基因频率、最大似然估计方法

到目前为止&#xff0c;我们主要讨论了等位基因和基因型频率&#xff0c;以及我们如何可以从一个推断出另一个。但是&#xff0c;如果我们不知道等位基因频率&#xff0c;只知道种群中存在哪些表型呢&#xff1f;如果我们足够幸运&#xff0c;知道哪些表型对应哪些基因型&#…

一键安装部署,在 Ubuntu 服务器上快速搭建基于 Ghost CMS的网站

我们在上一篇内容中讲过&#xff0c;如何使用 Helm 在 Kubernetes 集群上安装 WordPress&#xff0c;创建高可用性网站。而这次我们将基于另一个流行的内容管理系统 Ghost CMS 在 DigitalOcean 云主机进行建站。 Ghost 也是开源的内容管理系统&#xff08;CMS&#xff09;&…

C#知识|项目的实施过程及通用三级架构的搭建笔记

哈喽,你好啊,我是雷工! 01 项目需求分析 根据与需求方沟通,分析需求,一般都有需求分析师来进行项目需求收集与分析。 根据需求文档进行项目功能设计。 02 框架的选择 ①小项目可以根据需求选择两层或三层结构。 ②中型大型项目,至少需要三层架构和其他架构的组合。 03 框…

Spring学习03-[Spring容器核心技术IOC学习进阶]

IOC学习进阶 Order使用Order改变注入顺序实现Ordered接口&#xff0c;重写getOrder方法来改变自动注入顺序 DependsOn使用 Lazy全局设置-设置所有bean启动时候懒加载 Scopebean是单例的&#xff0c;会不会有线程安全问题 Order 可以改变自动注入的顺序 比如有个animal的接口&a…

NEMU模拟器的gdb调试和指令调试

NEMU模拟器的gdb调试和指令调试 1 通过gdb调试NEMU1.1 编译NEMU1.2 gdb调试 2 通过NEMU调试指令 关于如何编译NEMU&#xff0c;以及编译MySBIBenOS固件&#xff0c;运行等前置知识&#xff0c;可参考 《NEMU模拟器源码编译与使用》。 1 通过gdb调试NEMU 1.1 编译NEMU 当我使…

E2.【C语言】练习:static部分

#include <stdio.h> int sum(int a) {int c 0;static int b 3;c 1;b 2;return (a b c); } int main() {int i;int a 2;for (i 0; i < 5;i){printf("%d ", sum(a));} } 求执行结果 c是auto类变量(普通的局部变量)&#xff0c;自动产生&#xff0c…

Windows 11 操作无法完成(错误 0x00000709)。

这里写自定义目录标题 环境错误一错误二错误三重点 环境 共享端&#xff1a;Win11 专业版 23H2 本地端&#xff1a;Win11 专业版 23H2 错误一 操作无法完成(错误 0x00000709)。 再次检查打印机名称&#xff0c;并确保打印机已连接到网络。 解决&#xff1a; 组策略设置 打开…

sql查询 只取某字段重复数据中的一条

一. 前提条件 某表的主键由两个字段A、B构成&#xff08;或者更多&#xff09;&#xff0c;任何其中一个字段都可能具有重复的数据。 需要只取字段A所有重复数据中的一条构成查询结果&#xff0c;也就是字段A取到所有的可能取值且无重复。 二. 方法一&#xff08;where ... …