首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏慎独

    AVPlayer+AudioUnit之播放视频音轨(AVAssetTrack)

    参考 AudioUnit官方文档 AudioTapProcessor官方Demo 解法 iOS provides three I/O (input/output) units. 基本思路 如果AVPlayer使用AudioUnit,直接Hook改变subType完成。 从AVPlayer解码过程中取到实时音频数据,直接转推到另一个AudioUnit播放出来,这种方案要是能通,Seek等可以默认实现对齐。 尝试一 首先是看到官网中的架构图,第一反应肯定是AVPlayer的音频播放也是基于AudioUnit,那就好办了 ? 直接Hook一下AudioUnit的几个核心函数,然后替换一下Unit初始化的subType。都是C函数,这里要使用到fishhook。

    3K20发布于 2020-11-03
  • 来自专栏代码手工艺人

    深入理解 AudioUnit(二) ~ Mixing Unit & Effect Unit & Converter Unit

    本系列的 第一篇 中介绍到了 AudioUnit 中和系统硬件交互的 IO Unit, 以及如何使用它进行音频的采集和播放. 本文是该系列的第二篇, 将会介绍 AudioUnit 中另外 四类 非常重要的 AudioUnit: Mixing 、 Effect Unit 、 Converter Unit 以及 Generator 当 AudioUnit 的输入和输出的格式不一致时, AudioUnit 内部也会使用该 unit 进行自动转换. 所以大部分情况下我们都不需要手动去转换. 总结 本文属于《深入理解 AudioUnit》系列的第二篇, 主要介绍了 Mixing AudioUnit 的三种类型和结构, 详细介绍了他们自己的特点. 同时了解了 Effect、Converter、Generator 这几类 AudioUnit. 下一篇我们将会了解到 如何把我们了解到的这些 AudioUnit 串联起来, 实现一个具体的场景.

    1.5K21编辑于 2022-03-30
  • 来自专栏音视频直播技术专家

    iOS下解码AAC并播放

    前言 今天我们介绍一下如何在iOS进行AAC解码,并使用AudioUnit播放解码后的PCM数据。 基本流程 iOS系统对音频处理做了三层封装。包括应用层、服务层和硬件层。如下图所示: ? 将解码后的 PCM 数据送给 AudioUnit 播放声音。 重复 3-5 步,直到整个 AAC 文件被读完。 下面我们对以上每一步做详细介绍。 播放 PCM 我们使用 iOS 中的 AudioUnit 工具来播放 PCM。AudioUnit的使用步骤如下: 设置音频组件描述。其作用是通过该描述信息,可以在iOS中找到相关的音频组件。 创建 AudioUnit 实例。 设置 AudioUnit 属性。 播放 PCM。 通过 AudioUnit 播放 PCM。 循环执行 3-5步,直到文件结束。

    3.9K21发布于 2020-04-01
  • 来自专栏代码手工艺人

    深入理解 AudioUnit(一) ~ IO Unit 结构和运行机制

    Apple 平台上如果涉及到音频采集, 很难避开 AudioUnit 这个工具库, AudioUnit 是 Audio Toolbox 下的一套有年头的 C API, 功能相对也比较强大, 虽然苹果最近几年推出并逐渐在其基础之后完善了一套 接下来将带大家剖析 AudioUnit 的内部原理和丰富多样的使用方式, 如果你在做涉及到声音采集和处理的工作, 希望能带大家深入浅出地摸透 AudioUnit. AudioUnit 介绍 如下图, 可见 iOS 上所有的音频基础都是基于 AudioUnit 的, 比如 AudioToolbox、Media Player, AV Foundation 等都是在 AudioUnit AudioUnit 提供了一个通用的方法, 我们问一个 AudioUnit 要数据, 可以通过 AudioUnitRender 函数来实现. 了解了 RemoteIO 和 VPIO 各自的特点 Ref: AudioUnit Hosting Guide AudioUnit Samples @ GitHub

    3.2K33编辑于 2022-03-30
  • 来自专栏Golang开发

    iOS音频(2)——Audio Unit

    (3)AudioUnit: 音频处理组件,是对音频处理节点的实例描述者和操控者。    类中有定义: typedef AudioComponentInstance AudioUnit; (2)通过AUNode创建AudioUnit AUGraph是由AUNode的串联而成,首先需要先创建一个 第二个参数是我们刚才的AUNode,最终输出的AudioUnit。 image.png AudioUnit实际上就是一个AudioComponentInstance实例对象,一个AudioUnit由scope(范围)和element(元素)组成,实际上开发中主要涉及到输入输出的问题 掌握需要同学们切合实际的敲代码运用AudioUnit 使用的简单示例

    2.8K41发布于 2019-05-29
  • 来自专栏音视频直播技术专家

    iOS 实时音频采集与播放

    使用 AudioComponentInstanceNew(ourComponent, &audioUnit) 获得 Audio Unit 实例。 OSStatus status; AudioComponentInstance audioUnit; // 描述音频元件 AudioComponentDescription desc; desc.componentType ); checkStatus(status); 开启 Audio Unit OSStatus status = AudioOutputUnitStart(audioUnit); checkStatus( status); 关闭 Audio Unit OSStatus status = AudioOutputUnitStop(audioUnit); checkStatus(status); 结束 Audio Unit AudioComponentInstanceDispose(audioUnit); 录制回调 static OSStatus recordingCallback(void *inRefCon

    5.7K23发布于 2020-04-02
  • 来自专栏落影的专栏

    Audio Unit播放PCM文件

    属性; AudioUnitGetPropertyInfo 用于在设置或者读取属性之前,获取属性可以修改的大小和是否可写,避免error的产生; AudioUnitInitialize 是初始化AudioUnit ; 3、初始化AudioBufferList,mNumberBuffers和mNumberChannels设置为1,需要注意的是mData,初始化mData的时候需要手动分配内存; 4、设置AudioUnit 的回调函数,注意是OUTPUT_BUS的输入域的回调;调用AudioUnitInitialize初始化AudioUnit; 6、调用AudioOutputUnitStart开始,AudioUnit会调用之前设置的 本文主要介绍AudioUnit如何播放声音,后续的两篇文章介绍AudioUnit的录音场景还有配合AudioConvert播放各种格式的文件。 Demo的代码逻辑已经经过精简,以较为简练的代码介绍使用AudioUnit的必需步骤。看似简单的功能,也是看了很多篇苹果官方的文档才明白。

    3.5K60发布于 2018-04-27
  • 来自专栏落影的专栏

    Audio Unit录音(播放伴奏+耳返)

    具体细节 1、初始化AudioUnit,类似Audio Unit播放PCM文件,不过这次要设置AVAudioSession的Category为AVAudioSessionCategoryPlayAndRecord ,同时要开启AudioUnit的Record功能,同时要设置RecordCallback函数; 2、加载并打开伴奏文件,在PlayCallback的回调中,读取伴奏数据并塞给AudioUnit; 3 、在RecordCallback函数中调用AudioUnitRender加载录音数据到bufferList,并在PlayCallback的回调中,把bufferList的数据copy给AudioUnit 总结 Demo地址 在学习一段时间后,发现AudioUnit的API非常清晰,在出现问题后都能较快定位,值得学习这种API设计。 在写demo过程中,对AudioUnit有了更好的认知,下一篇介绍AudioConvert和AudioUnit的配合使用,播放aac、mp3、m4a等音频文件。

    3.5K60发布于 2018-04-27
  • 来自专栏落影的专栏

    Audio Unit播放aac/m4a/mp3等文件

    AudioUnit不支持vbr的数据,也不支持从一个有损压缩格式转换为pcm或者pcm转换为有损格式,对于有损格式的音频数据转换,需要用CoreAudio的Audio Converter API。 ,设置AVAudioSession的Category为AVAudioSessionCategoryPlayback;初始化AudioBufferList,设置AudioUnit的playback回调; 3、在AudioUnit的playback回调中,调用AudioConvert的AudioConverterFillComplexBuffer函数并设置好回调方法lyInInputDataProc;在回调的 AudioFileReadPacketData读取音频数据并把读取的AudioStreamPacketDescription回传; 4、AudioConvert转换后的音频数据会填入参数buffList,将对应的数据复制给AudioUnit AudioStreamPacketDescriptions参数来辅助转换音频数据; 解决方案就是新建AudioStreamPacketDescriptions数组,并且在读取后赋值给outDataPacketDescription(见demo); 总结 AudioUnit

    3.3K100发布于 2018-04-27
  • 来自专栏关键帧Keyframe

    iOS 音频处理框架及重点 API 合集丨音视频工程示例

    常用的数据类型: AudioUnit[13],typedef AudioComponentInstance AudioUnit;。 AudioUnitParameter[14]:表示 AudioUnit 的参数,一个 AudioUnit 参数由 scope、element、parameterID 三属性定义。 AudioUnitUninitialize(...)[17]:卸载一个 AudioUnit。一旦一个 AudioUnit 被初始化后,要想改变它的状态来响应某些环境变化,就需要先卸载。 这时候会使得 AudioUnit 释放它的资源。此后,调用者可以重新配置这个 AudioUnit 来适配新的环境,比如处理与之前不同的采样率。 AudioOutputUnitStop(...)[27]:关闭一个 I/O AudioUnit,同时会关闭与之连接的 AudioUnit Processing Graph。

    2.5K20编辑于 2022-06-13
  • 来自专栏落影的专栏

    AUGraph结合RemoteI/O Unit与Mixer Unit

    实际工程中更多使用的是AUGraph的方式进行AudioUnit的初始化。 每个AudioUnit都有Input, Output 和 Global 三个域。 添加AUNode的节点有两个步骤,先通过AUGraphAddNode添加节点,再通过AUGraphNodeInfo获取节点对应的AudioUnit。 必须先打开AUGraph,才进行获取AudioUnit的操作。 下图阐释了AudioUnit是如何通过AudioUnitRender去Pull音频流数据 ?

    2.3K90发布于 2018-04-27
  • 来自专栏落影的专栏

    iOS近距离实时合唱

    7、AuidoUnit录制回调(手机A) 手机A的AudioUnit回调,会把人声数据缓存到mOutputCircleBuffer里,等待发送。 3、卡顿定位 合唱有主线程、Multipeer相关线程和AudioUnit线程,其中AudioUnit线程是一个实时的线程,需要注意: 1、不能分配大量内存; 2、不能调用阻塞的方法; 3、runtime unsafe; 为监控AudioUnit的卡顿,可添加每次AudioUnit线程回调的耗时统计。 5、环形缓冲 在整个合唱过程中,AudioUnit不断录制人声用于Multipeer发送,同时不断播放消费Multipeer收到的人声。 6、同步启动 为了实现AudioUnit的同步启动,当server/client在进行建立流通道握手时,先满足启动的条件的一端要延迟启动timeDelay,尽量保证AudioUnit启动时间相差更小。

    1.4K70发布于 2018-04-27
  • 来自专栏落影的专栏

    Audio Unit和ExtendedAudioFile播放音频

    iOS和OS X系统) iOS在线音频流播放 Audio Unit播放PCM文件 Audio Unit录音(播放伴奏+耳返) Audio Unit播放aac/m4a/mp3等文件 前文介绍了AudioUnit 3、初始化AudioUnit,并设置输入的格式与ExtAudioFileRef的输出格式一致; 4、在AudioUnit的播放回调中调用ExtAudioFileRead读取ExtAudioFileRef

    2.4K50发布于 2018-04-27
  • 来自专栏音视频直播技术专家

    iOS音频播放(一)

    ; 如果你正在开发一个专业的音乐播放软件,需要对音频施加音效(均衡器、混响器),那么除了数据的读取和解析以外还需要用到AudioConverter来把音频数据转换成PCM数据,再由AudioUnit+AUGraph PCM数据通过音效器处理完成后就可以使用AudioUnit播放了,当然AudioQueue也支持直接使对PCM数据进行播放。)。 下图描述的就是使用AudioFile + AudioConverter + AudioUnit进行音频播放的流程(图片引自官方文档)。 ?

    2.6K21发布于 2020-04-02
  • 来自专栏移动端开发

    最新 iOS 框架整体梳理(一)

    7、AudioToolbox、AudioUnit AudioToolbox 是专门处理声音的一个框架,AudioToolbox 这个库是C的接口,偏向于底层,用于在线流媒体音乐的播放。 AudioUnit 其实是最底层的,我们在使用的像 AVFoundation,Media Player ,AudioToolbox 等都是基于AudioUnit进行的封装。 ? Core Audio 中也包含我们最常用的前面也有说过的 AudioToolbox和AudioUnit 框架。要具体的说它里面的内容我们也能写一本书了。

    2.1K11发布于 2020-06-19
  • 来自专栏关键帧Keyframe

    音视频面试题集锦第 16 期

    3)音频采集 对于音频采集,除了可以使用 AVCaptureSession 来进行音频采集外,还可以使用 AudioUnit。 使用 AudioUnit 音频采集: 优点:更底层,更高效;在创建 unit 后,可以直接设置音频采集格式(如:通道数等)。 缺点:需要自己处理音频中断等情况。

    72210编辑于 2024-02-26
  • 来自专栏Molier的小站

    关于实现唱吧清唱功能的理解

    %@", buffer); }]; [self.engine startAndReturnError:nil]; # 总结 通过如上方法可以完整的实现清唱功能,但是唱吧清唱使用的是 AudioUnitAudioUnit 是 iOS 中音频的非常底层的实现,由 C 语言实现,因为唱吧中除了清唱之外还有很多非常复杂的音频处理功能,所以只有 AudioUnit 可以满足,但是对于清唱这个功能来说,两种实现方式达到了同样的效果 ,本文介绍的更加轻量级,不过关于 AudioUnit 也正在学习过程,后续会输出相应的文章。

    1.6K40编辑于 2022-11-03
  • 来自专栏落影的专栏

    《音视频开发进阶指南》—— 读书笔记

    一张图理解DTS、PTS、GOP 关于视频压缩编码和音频压缩编码的基本原理点击这里 二、iOS平台上的音视频 1、音频 音频录制、播放使用AudioUnit。 使用VideoToolbox硬编码H.264 使用VideoToolbox硬解码H.264 使用AudioToolbox编码AAC 使用AudioToolbox播放AAC 2.播放器;(音频用AudioUnit

    2.8K70发布于 2018-04-27
  • 来自专栏音视频技术

    短视频客户端SDK设计与实现

    对于iOS平台,我们使用的AUGraph,它底层使用的是AudioUnit,其中RemoteIO类型的AudioUnit可以采集人声,AudioFilePlayer类型的AudioUnit可以播放伴奏。 然后通过Mixer类型的AudioUnit将人声和伴奏混合之后入队,后面Consumer线程中的Encoder从队列中取出PCM数据进行编码。 视频架构设计 视频部分的结构设计相对会简单一些。

    4.6K20发布于 2021-09-02
  • 来自专栏落影的专栏

    iOS音视频播放(Audio Unit播放音频+OpenGL ES绘制视频)

    CMSampleBuffer,用方法CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer把音频数据转成AudioBufferList格式,再采用AudioUnit

    3K90发布于 2018-04-27
领券