构建 Audio Unit 应用程序

iOS音频播放(三)AudioUnit介绍与实战 混响效果器:子类型是kAudioUnitSubType_Reverb2,对于人声处理来讲这是非常重要的效果器,可以想象自己身处在一个空房子中,如果有非常多的反射声和原始声叠加在一起,那么从听感上可能会更有震撼力,但是同时原始声音也会变得更加模糊,原始声音的细节会被遮盖住,所以混响的设置的大小对于不同的人来讲会很不一致,可以根据自己的喜好来进行设置。苹果官方文档中描述,AudioUnit提供了音频快速的模块化处理,如果是在以下场景中,更适合使用AudioUnit而不是使用高层次的音频框架。 阅读详情

构建 Audio Unit 应用程序

使用 Audio Unit 构建应用程序主要步骤是选择一个设计模式,然后编写代码来实现该模式。

从选择设计模式开始

在 iOS 应用程序中,Audio Unit 有很多基本设计模式。每种模式都有的共同特征:

  • 仅仅只有一个 I/O 单元。

  • 在整个 audio processing graph 中使用单一的音频流格式,尽管该格式可能存在变化。

  • 要求在特定位置设置流格式或部分流格式。

正确设置流格式对于建立音频数据流至关重要。这些模式大多依赖于音频单元连接提供的音频流格式从源到目的地的自动传播。合理利用这种传播的特性可以减少了编写和维护的代码量。同时,必须保证清楚了解每种模式需要如何进行设置。例如,必须在 iPod EQ 单元的输入和输出上设置完整的流格式。

在大多数情况下,设计模式都会使用 AUGraph。虽然可以在不使用 graph 的情况下实现这些模式中的任何一种,但使用 graph 可以简化代码并支持动态重新配置。

I/O Pass Through

I/O Pass Through 模式将传入的音频直接发送到输出硬件,没有处理音频数据的选项。虽然这没有什么实际价值,但基于这种模式构建 Audio Unit 应用程序是验证和巩固对 Audio Unit 概念的理解的好方法。图 2-1 说明了这种模式。

请添加图片描述

如图所示,音频输入硬件将其流格式强加在 Remote I/O unit 的 input element 的外向一侧。开发者需要指定要在此元素的内侧使用的格式, 音频单元内部将根据需要执行格式转换。为了避免不必要的采样率转换,在定义流格式时最好使用音频硬件的采样率。我们也不必指定 Remote I/O unit 的 output element 的流格式,因为流格式会通过连接从 input element 传给 output element。同理,传给硬件的流将会根据硬件需要完成一次自动转换。

I/O Without a Render Callback Function

可以在 Remote I/O unit 的元素之间添加一个或多个其他音频单元,例如,使用多通道混音器单元将传入的麦克风音频定位在立体声域中,或提供输出音量控制。在这个设计模式中,仍然没有渲染回调函数,如图 2-2 所示。这简化了模式,但限制了其效用。如果没有渲染回调函数,就无法直接操作音频。

请添加图片描述

在此模式中,可以像在 I/O Pass Through 模式中一样配置 Remote I/O unit 的两个元素。要设置多通道混音器单元,必须在混音器输出上设置流格式的采样率。混音器的输入流格式通过音频单元连接从 Remote I/O unit 的 input element 的输出中传播,自动建立。同样,Remote I/O unit 的 output element 输入范围的流格式由音频单元连接建立,这要归功于混音器单元输出的传播。

在这种模式的任何情况下,每当使用 I/O unit 以外的其他音频单元时,必须设置 kAudioUnitProperty_MaximumFramesPerSlice 属性。与 I/O Without a Render Callback Function 模式一样,无需配置任何音频数据缓冲区。

I/O with a Render Callback Function

通过在 Remote I/O unit 的输入和输出元素之间放置渲染回调函数,可以在传入音频到达输出硬件之前进行操作,例如:使用渲染回调函数来调整输出音量,还可以添加颤音、环调制、回声或其他效果。这种模式如图 2-3 所示。

请添加图片描述

如图所示,此模式使用 Remote I/O unit 的两个元素。将渲染回调函数附加到 output element 的input scope。当该元素需要另一组音频数据时,系统会触发回调。反过来,回调通过调用 Remote I/O unit 的 input element 的渲染回调函数来获得新的音频数据。

与其他 I/O 模式一样,您必须在 Remote I/O unit 上明确启用输入,因为默认情况下,输入是禁用的。而且无需配置任何音频数据缓冲区。

请注意,当使用渲染回调函数建立从一个音频单元到另一个音频单元的音频路径时,回调取代了音频单元连接。

Output-Only with a Render Callback Function

在最简单的情况下,这种模式涉及一个直接连接到 Remote I/O unit 的 output element 的 input scope 的渲染回调函数,如图 2-4 所示。

请添加图片描述

可以利用此模式完成复杂的音频结构。例如,将几个声音混合在一起,然后通过设备的输出硬件播放它们。图 2-5 显示了这种情况。

请添加图片描述

在图中,需要在 iPod EQ 的输入和输出上设置完整的流格式,多通道混音器只需要在其输出上设置正确的采样率。正如前面说到的,完整的音频流格式信息会在传递的过程中自动赋值。

对于每个多通道混合器单元输入,要设置完整的流格式。对于 input 0,需要显式设置它的流格式。对于 input 1,流格式由音频单元连接从 iPod EQ 单元的输出传播。一般来说,必须单独考虑每个音频单元的流格式需求。

其他设计模式

Audio Unit 还有另外两种主要设计模式:

  1. Input-only with a Render Callback Function:回调函数由应用程序调用,将音频数据传给 Remote I/O unit 的 input element。然而,在大多数情况下,对于这样的应用程序来说,更好的选择是使用输入音频队列对象(使用 AudioQueueNewInput 函数实例化的 AudioQueueRef 类型),使用音频队列对象提供了更大的灵活性,因为它的渲染回调功能不在实时线程上。

  2. Generic Output unit:离线音频处理。与 Remote I/O unit 不同,该音频单元无法连接到设备的音频硬件。当使用它向应用程序发送音频时,它仅仅取决于应用程序调用其渲染方法。

构建应用程序

无论选择哪种设计模式,构建 Audio Unit 应用程序的步骤基本相同:

  1. 配置 audio session。
  2. 指定 audio unit。
  3. 创建 audio processing graph,然后获取 audio unit。
  4. 配置 audio unit。
  5. 连接 audio unit nodes。
  6. 提供用户界面。
  7. 初始化然后开启 audio processing graph。

配置 audio session

构建 Audio Unit 应用程序的第一步与任何 iOS 音频应用程序的步骤相同:配置音频会话。音频会话是应用程序和硬件交互的中介,它的特征在很大程度上决定了应用程序的音频功能及其与系统其他部分的交互性。首先指定要在应用程序中使用的采样率,如下所示:

self.graphSampleRate = 44100.0; // 单位:赫兹

接下来,使用音频会话对象请求系统使用指定采样率作为设备硬件采样率。这里的目的是避免硬件和应用程序之间的采样率转换。这可以最大限度地提高 CPU 性能和音质,并最大限度地减少功耗。

NSError *audioSessionError = nil;
// 获取 audio session 单例对象
AVAudioSession *mySession = [AVAudioSession sharedInstance];
// 请求当前设备硬件使用的采样率
[mySession setPreferredHardwareSampleRate: graphSampleRate
                                    error: &audioSessionError];
// 设置音频分类,AVAudioSessionCategoryPlayAndRecord 指的是支持音频输入与输出
[mySession setCategory: AVAudioSessionCategoryPlayAndRecord
                                    error: &audioSessionError];
// 激活 audio session
[mySession setActive: YES error: &audioSessionError];
// 激活会话后更新采样率
self.graphSampleRate = [mySession currentHardwareSampleRate];

还可以配置其他硬件特征:音频硬件 I/O 缓冲区持续时间。采样率在 44.1kHz 的延时约为 23ms,相当于每次采集 1024 个采样点。如果 I/O 延迟在应用程序中至关重要,可以设置更短的 duration,低至约 0.005ms(相当于 256 个采样点),如下所示:

self.ioBufferDuration = 0.005;
[mySession setPreferredIOBufferDuration: ioBufferDuration
                                  error: &audioSessionError];

有关如何配置和使用音频会话对象的完整说明,请参阅:Audio Session Programming Guide。

指定 audio unit

在运行时,配置音频会话后,应用程序尚未获取音频单元。可以使用 AudioComponentDescription 结构来得到一个指定的音频单元,然后根据音频单元说明符和选择的设计模式构建一个 audio processing graph。

创建 audio processing graph

在此步骤中,将创建设计模式的骨架。具体来说,有以下几步:

  1. 实例化 AUGraph 对象,该实例代表 audio processing graph。
  2. 实例化一个或多个 AUNode 对象,每个对象代表 graph 中的一个音频单元。
  3. 添加 nodes 到 graph。
  4. 打开 graph 并且实例化 audio units。
  5. 获得 audio units 引用。

下面代码显示了如何对包含 Remote I/O unit 和多通道混合器单元的 graph 执行这些步骤。假设已经为每个音频单元定义了 AudioComponentDescription 结构。

AUGraph processingGraph;
NewAUGraph (&processingGraph);
 
AUNode ioNode;
AUNode mixerNode;
 // 已经为每个音频单元定义了 AudioComponentDescription 结构
AUGraphAddNode(processingGraph, &ioUnitDesc, &ioNode);
AUGraphAddNode(processingGraph, &mixerDesc, &mixerNode);

AUGraphAddNode 函数调用使用音频单元说明符 ioUnitDesc 和 mixerDesc。此时,图形被实例化,并拥有您将在应用程序中使用的节点。要打开 graph 并实例化音频单元,请调用 AUGraphOpen:

AUGraphOpen (processingGraph);

然后,通过 AUGraphNodeInfo 函数获取对音频单元实例的引用,如下所示:

AudioUnit ioUnit;
AudioUnit mixerUnit;
 
AUGraphNodeInfo(processingGraph, ioNode, NULL, &ioUnit);
AUGraphNodeInfo(processingGraph, mixerNode, NULL, &mixerUnit);

ioUnit 和 mixerUnit 变量现在保存对图形中音频单元实例的引用,允许对它们进行配置和互连音频单元。

配置 audio unit

每个 iOS 音频单元都需要自己的配置,这里介绍一些常见的配置:

  • 默认情况下,Remote I/O unit 启用输出并禁用输入。如果同时执行 I/O,或仅使用输入,必须相应地重新配置 I/O unit。

  • 除 Remote I/O unit 和 Voice-Processing I/O unit 外,所有 iOS 音频单元都需要配置其 kAudioUnitProperty_MaximumFramesPerSlice 属性。此属性确保音频单元准备好生成足够数量的音频数据帧,以响应渲染调用。

  • 所有音频单元都需要在输入、输出或两者上定义其音频流格式。

编写并绑定渲染回调函数

对于使用渲染回调函数的设计模式,必须编写这些函数,然后在正确的点添加它们。

可以在音频数据不流动时,使用 audio unit API 立即添加渲染回调:

AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc        = &renderCallback;
callbackStruct.inputProcRefCon  = soundStructArray;
 
AudioUnitSetProperty (
    myIOUnit,
    kAudioUnitProperty_SetRenderCallback,
    kAudioUnitScope_Input,
    0,                 // output element
    &callbackStruct,
    sizeof (callbackStruct)
);

也可以使用 audio processing graph API 以线程安全的方式附加渲染回调,即使在音频数据流动时:

AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc        = &renderCallback;
callbackStruct.inputProcRefCon  = soundStructArray;
 
AUGraphSetNodeInputCallback (
    processingGraph,
    myIONode,
    0,                 // output element
    &callbackStruct
);
// ... some time later
Boolean graphUpdated;
AUGraphUpdate (processingGraph, &graphUpdated);

连接 audio unit nodes

在大多数情况下,最好使用 audio processing graph API 中的 AUGraphConnectNodeInput 和 AUGraphDisconnectNodeInput 函数建立或断开音频单元之间的连接。这些函数是线程安全的,避免了显式定义连接的编码开销。

AudioUnitElement mixerUnitOutputBus  = 0;
AudioUnitElement ioUnitOutputElement = 0;
 
AUGraphConnectNodeInput (
    processingGraph,
    mixerNode,           // source node
    mixerUnitOutputBus,  // source node bus
    iONode,              // destination node
    ioUnitOutputElement  // desinatation node element
);

或者,可以使用音频单元属性机制直接建立和断开音频单元之间的连接。要做到这一点,请使用 AudioUnitSetProperty 函数以及 kAudioUnitProperty_MakeConnection 属性。这种方法要求为每个连接定义一个 AudioUnitConnection 结构,作为其属性值。

AudioUnitElement mixerUnitOutputBus  = 0;
AudioUnitElement ioUnitOutputElement = 0;
 
AudioUnitConnection mixerOutToIoUnitIn;
mixerOutToIoUnitIn.sourceAudioUnit    = mixerUnitInstance;
mixerOutToIoUnitIn.sourceOutputNumber = mixerUnitOutputBus;
mixerOutToIoUnitIn.destInputNumber    = ioUnitOutputElement;
 
AudioUnitSetProperty (
    ioUnitInstance,                     // connection destination
    kAudioUnitProperty_MakeConnection,  // property key
    kAudioUnitScope_Input,              // destination scope
    ioUnitOutputElement,                // destination element
    &mixerOutToIoUnitIn,                // connection definition
    sizeof (mixerOutToIoUnitIn)
);

提供用户界面

在许多情况下,需要提供一个用户界面,允许用户调整特定的音频单元参数,并在某些特殊情况下调整音频单元属性,比如:要更改 iPod EQ单元的活动均衡曲线,需要更改 kAudioUnitProperty_PresentPreset 属性的值。无论哪种情况,用户界面还应提供有关当前设置的视觉反馈。

初始化然后开启 audio processing graph

在开始音频流之前,必须通过调用 AUGraphInitialize 函数来初始化 audio processing graph。这个关键步骤:

  1. 通过为每个单元单独自动调用 AudioUnitInitialize 函数来初始化 graph 拥有的音频单元(如果要在不使用 graph 的情况下构建处理链,则必须依次显式初始化每个音频单元)。
  2. 验证 graph 的连接和音频数据流格式。
  3. 跨音频单元连接,传播流格式。
OSStatus result = AUGraphInitialize(processingGraph);
// Check for error. On successful initialization, start the graph...
AUGraphStart(processingGraph);
// Some time later
AUGraphStop(processingGraph);

Debug 小技巧

  1. 通过函数返回值可以检查调用是否成功。
  2. 注意函数调用之间的依赖性。例如,只有在成功初始化 audio processing graph 后,才能启动它。检查 AUGraphInitialize 的返回值。如果函数成功返回,就可以启动图表。如果失败了,利用 CAShow 函数将 graph 的状态打印到控制台。
  3. 确保您将每个 AudioStreamBasicDescription 结构初始化为 0,如下所示:AudioStreamBasicDescription stereoStreamFormat = {0};。将 ASBD 的字段初始化为 0 可确保没有字段包含垃圾数据(注意:作为类声明中的实例变量,其字段会自动初始化为 0,无需自己初始化它们)。
  4. 可以将 AudioStreamBasicDescription 结构的字段值打印到 Xcode 控制台,这在开发过程中非常有用。
    - (void) printASBD: (AudioStreamBasicDescription) asbd {
        char formatIDString[5];
        UInt32 formatID = CFSwapInt32HostToBig(asbd.mFormatID);
        bcopy(&formatID, formatIDString, 4);
        formatIDString[4] = '\0';
    
        NSLog (@"  Sample Rate:         %10.0f",  asbd.mSampleRate);
        NSLog (@"  Format ID:           %10s",    formatIDString);
        NSLog (@"  Format Flags:        %10X",    asbd.mFormatFlags);
        NSLog (@"  Bytes per Packet:    %10d",    asbd.mBytesPerPacket);
        NSLog (@"  Frames per Packet:   %10d",    asbd.mFramesPerPacket);
        NSLog (@"  Bytes per Frame:     %10d",    asbd.mBytesPerFrame);
        NSLog (@"  Channels per Frame:  %10d",    asbd.mChannelsPerFrame);
        NSLog (@"  Bits per Channel:    %10d",    asbd.mBitsPerChannel);
    }
    
    这种方法可以快速揭示 ASBD 中的问题。
Core Audio音频基础概述 大多情况下,我们无法直接与HAL进行交互,Apple提供了一个特别的audio unit,即OS X中的AUHAL, iOS中的AURemoteIO, 我们可以通过它们让音频与硬件交互. 阅读详情

相关推荐

Audio Unit(三):Audio Unit Development Fundamentals

当您开始创建音频单元时,Core audio的音频单元框架的强大功能和灵活性使您能够随时随地播放声音。然而,这种力量和灵活性也意味着,要想从正确的方向开始,还有很多东西需要学习。在本章中,您将鸟瞰这一前沿技术,为您迈向成为音频单元开发人员的第一步服务。 从这里开始,您可以快速了解音频单元的开发周期。然后,您将重点介绍什么是音频单元,并了解核心音频SDK在音频单元开发中的重要作用。您将了解音频单元在OSX中如何作为插件工作,以及如何与使用它们的应用程序协同工作。最后,介绍音频单元规范,以及它如何定义音频单元开

Yuan 803

Audio Unit详解

一、什么是Audio Unit iOS提供了音频处理插件,支持混合、均衡、格式转换和实时输入/输出用于录制、播放、离线渲染和实时对话如VoIP(互联网协议语音)。你可以从iOS应用动态加载和使用它,这些强大和灵活的插件叫做Audio Unit。 Audio units通常工作在一个封闭对象的上下文中,该对象为audio processing graph,如下图。在此例中,你的app通过一个或多个callback functions发送audio到第一个audio unit,并对每个audio un...

u010029439的博客 1881

VS配置RTKLIB(卫星定位开源代码)环境

@RTKlib代码调试教程-Visual Studio 2019 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ##RTKLIB-rtklib_2.4.3 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @RTKlib代码调试教程-Visual Studio 2019 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技

qq_42209977的博客 4486

Audio Unit: iOS中最底层最强大的音频控制API

Audio Session基础(Core Audio基本数据结构(音视频基础知识C/C++ 简单数据结构,函数使用以下概念是文中常用的词语,因为其含义一般直接用英文表达, 一般不需中文翻译,可将其理解为固定名词词组.audio unit: 主要介绍的技术名称audio processing graph: 另一种处理audio unit的技术node: 承载audio unit的容器。

irainsa的博客 567

基于大模型的恶性胸腔积液全周期预测与诊疗方案研究

本研究基于大模型技术构建了恶性胸腔积液全流程预测与诊疗体系,涵盖术前风险评估、术中方案优化、术后恢复预测及并发症预防。通过整合多源医疗数据,实现了手术风险概率预测(准确率80%)、并发症预警(AUC值0.85)及个性化康复方案制定,显著提升诊疗精准度。研究创新性地将Transformer架构与多模态数据融合,在100例临床验证中显示良好性能,但存在数据样本局限、模型可解释性不足等问题。未来将扩大多中心临床验证,优化算法可解释性,探索与基因检测等技术的结合应用,推动恶性胸腔积液的精准诊疗发展。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1896

Visual Studio报错TRK0005找不到CL.exe?三步彻底解决环境变量问题

本文详细解析了Visual Studio报错TRK0005找不到CL.exe的根本原因,并提供了三步彻底解决环境变量问题的方案。从验证安装完整性到配置永久环境变量,再到注册表级修复,帮助开发者建立健壮的开发环境配置体系,确保编译链稳定运行。

weixin_30839881的博客 459

Audio Unit 介绍

关于 Audio Unit iOS 提供了音频处理插件,支持混音,声音均衡,格式转化,以及用于录音,回放,离线渲染,实时对话的输入输出。可以动态载入和使用这些强大而灵活的插件,在 iOS 应用中这些插件被称为 audio units。 Audio units 通常在被称为 audio processing graph 的封闭对象的上下文中进行工作,如图所示,应用程序通过一个或者多个回调函数将音频发...

weixin_30711917的博客 377

Windows游戏多开检测实战:5种技术原理与破解方法详解(附C++代码)

本文深入解析了Windows游戏多开检测的5种核心技术原理,包括进程枚举、互斥体、信号量、窗口及文件映射检测,并详细探讨了对应的破解方法。通过分析这些基于进程和内核对象的攻防机制,为开发者与逆向爱好者提供了从底层理解Windows系统进程管理的实战视角,并附有核心C++代码示例。

weixin_29315091的博客 243

Audio Unit | 使用特定的音频单元

Audio Unit | 使用特定的音频单元

ProgramNovice的博客 1399

sentaurus学习笔记(一)器件仿真

之前有跟大家说,以后转到sentaurus,因此silvaco会用的比较少,结果发现真的有一点贪心厌旧的感觉,现在基本上不用silvaco(lll¬ω¬)故这篇文章,将为大家带来的是关于sentaurus的结构仿真和器件的特性的提取。我们还是老规矩,先上结构图。 还是一个经典的IGBT结构,这是一个典型的N型IGBT,下面我将把一些相关的结构,和具体的写法用下面一幅图表达出来。 这里因为方便看,我们把器件的比例画的比较抽象。可以看到的是,这里有很多的距离参数是用一些变量名来写的,这也是sentaurus

weixin_43262021的博客 2万+

【深度学习新浪潮】什么是system 1和system 2?

System 1(快速生成)指大模型直接基于输入生成响应,无需显式中间推理步骤。例如,GPT-4等模型在默认状态下通过Transformer直接输出结果,擅长快速回答简单问题或生成连贯文本,但在复杂逻辑任务中可能出错。这类模型的内部计算以向量形式隐式进行,难以处理符号推理等需要离散决策的任务。System 2(慢速推理)指模型通过生成中间token(如思维链、分步推导)或多次调用LLM进行复杂推理。

专注:太空算力、AI infra、异构调度、大模型成本工程 924

iOS Audio Unit (一)

最近一直在做iOS音频相关技术的项目,期间在官方及网上的资料文档也学习了很多,当然,iOS平台中音频相关技术还是有很多方面的,这里我先总体概述下,然后以I/O Audio Unit为例对其概念,基本用法和思路进行讲解,可能不够全面,一些细节需要自行查找相关文档。后面我会对github上一个开源的音频引擎框架进行源码分析,来展现在更复杂的音频技术应用场景下可能的设计及实现方式。本文图片及大部分技术概念阐述均来自apple官网。

irainsa的博客 479

PCL 点到面的ICP算法【2024最新版】

经典的点到面的ICP算法。博客长期更新,本文最新更新时间为:2024年10月18日。

点云侠的博客 36万+

iOS 实时音频采集与播放Audio Unit使用

前言   在iOS中有很多方法可以进行音视频采集。如 AVCaptureDevice, AudioQueue以及Audio Unit。其中 Audio Unit是最底层的接口,它的优点是功能强大,延迟低; 而缺点是学习成本高,难度大。 对于一般的iOS应用程序,AVCaptureDevice和AudioQueue完全够用了。但对于音视频直播,最好还是使用 Audio Unit 进行处理,这样...

欢迎关注我 https://x.com/Awesome_AI_News 3471

R语言机器学习:XGBoost线性回归模型的SHAP值

SHAP(SHapley Additive exPlanations)值是一种基于博弈论Shapley值的机器学习模型解释方法,能够解释任何模型的预测结果。其主要用途包括:1)提高模型的可解释性,帮助非技术用户理解模型预测;2)识别对模型预测最重要的特征,辅助特征选择;3)调试模型,发现预测中的异常;4)评估模型公平性,避免偏见。SHAP值的计算方法包括初始化、迭代计算、归一化和解释,常用工具如Python的shap库支持多种计算方式(如TreeSHAP、KernelSHAP等)。本文还提供了基于R语言计算

专注生信领域 3438

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Audio Unit: iOS中最底层最强大音频控制API

阅读前提: Audio Session基础(Audio Session) Core Audio基本数据结构(Core Audio) 音视频基础知识 C/C++ 简单数据结构,函数使用 以下概念是文中常用的词语,因为其含义一般直接用英文表达, 一般不需中文翻译,可将其理解为固定名词词组. audio unit: 主要介绍的技术名称 audio processing graph: 另一种处理au...

weixin_33788244的博客 1051

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Audio unit 详解

About Audio Unit Hosting iOS provides audio processing plug-ins that support mixing, equalization, format conversion, and realtime input/output for recording, playback, offline rendering, and liv

jeffasd的专栏 704

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

iOS Audio unit(音频单元)详解 关于音频单元托管

iOS Audio unit(音频单元)详解 关于音频单元托管 iOS 提供的音频处理插件支持混合,均衡,格式转换以及录制,回放,离线呈现和实时对话(如VoIP(互联网语音协议))的实时输入/输出。您可以从 ios 应用程序动态加载并使用 - 即 主机 - 这些强大且灵活的插件(称为 音频单元)。 音频单元通常在称为音频处理图的封闭对象的上下...

weixin_34138377的博客 529

使用Core Audio实现VoIP通用音频模块

最近一直在做iOS音频技术相关的项目,由于单项直播SDK,互动直播SDK(iOS/Mac),短视频SDK,都会用到音频技术,因此在这里收集三个SDK的音频技术需求,开发一个通用的音频模块用于三个SDK,同时支持iOS和Mac。   想要阅读更多技术干货、行业洞察,欢迎关注网易云信博客。 了解网易云信,来自网易核心架构的通信与视频云服务。   需求实现 主要包括音频采集,音频格式转换,音...

netease_im的博客 625

Apple - Audio Unit Programming Guide

一、介绍 谁应该阅读本文档? 本文档的组织 音频单元开发取得新进展 音频单元开发所需的工具 也可以看看 二、音频单元开发基础知识 1、音频单元开发周期 2、什么是音频单元? 音频单元程序结构和生命周期 音频单元文件结构 一些基本术语 3、音频单元作为插件 插件的本质 教程:在主机应用程序中使用音频单元 核心音频 SDK 的作用 音频单元的组件管理器要求 音频单元的安装和注册 音频单元识别 音频单元的插件 API 要求 音频单元规范 4、音频单元作为模型-视图-控制器设计模式的实例 5、音频单元实际运行 打开

AI工程化、开源分享、文档翻译、代码笔记 1418

iOS Audio 复习

iOS SDK附带提供多种方法播放声音剪辑,甚至产生音频的framework。 苹果的 Multimedia Programming Guide 介绍了每一个可用的音频框架的目的如下: 1.用Media Player framework 来播放用户的iPod音乐库中播放歌曲,有声书籍,音频播客。详细的请看 Media Player Framework Reference, iPod

justinjing的专栏 1662
上一篇: dispatch_once 详解
下一篇: dispatch_after
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值