我想在通往iOS设备扬声器的途中"拦截"音频数据.我相信这可以使用remoteIO音频单元和回调来完成.在下面的playbackCallback中,ioData实际上是否包含任何音频数据?
static OSStatus playbackCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) { ... }
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为关于ioData的日志信息似乎暗示它包含音频数据......
// if (ioData->mNumberBuffers > 0)
AudioBuffer buffer = ioData->mBuffers[0];
NSLog(@"buffer.mNumberChannels: %ld", buffer.mNumberChannels); // prints 2
NSLog(@"buffer.mDataByteSize : %ld", buffer.mDataByteSize); // prints 4096
Run Code Online (Sandbox Code Playgroud)
但是,从ioData的内容创建CMSampleBufferRef并使用AVAssetWriter将其写入CoreAudioFile会产生静默文件.输出文件的长度似乎很好(几秒钟),但是在Audacity中打开文件会显示一条平面线.
在阅读了大量的SO帖子并尝试了大量的remoteIO音频单元示例代码后,我开始怀疑上面的ioData是否包含应该在playbackCallback中填充的预先调整大小的空缓冲区.
我已经创建了一些代码来使用AV Foundation对mov文件进行屏幕捕获,我的下一步是记录Mac播放的声音,以便以后添加到录制的视频中.我做了一些挖掘,看起来我可能需要实现某种音频驱动程序来捕获音频.关于如何实现这一点的任何指针?
我假设以某种方式需要AudioUnit和IOKit ......
提前致谢.
我目前正在努力有效地使用Ausampler Unit.我使用了apple示例中的代码:https://developer.apple.com/library/ios/#samplecode/LoadPresetDemo/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011214-Intro-DontLinkElementID_2
缺点似乎是它会立即停止一个音符/样本,如果相同的音符再次出现.因此,如果我发送带有长号预设的midi音符60.然后在拿着这个的时候,我又发了一张纸条60.它切断了第一个音符事件.有没有人知道是否/如何能够持有每一个音符直到音符关闭事件(这个特定音符)进来?
其他问题:如何在发送后改变音符的音量?例如,我用100速度发送了midi音符60和70.虽然音符60仍然播放,但我想减少音量,但保持音符70.这将被称为midi aftertouch.
希望你能帮忙:)
我正在开发一个允许用户从麦克风录音的应用程序,并且我正在使用音频单元来实现此目的。我已经弄清楚音频后端并正在工作,并且我开始研究视图/控件等。有两件事我尚未实现:
1)我将使用OpenGL ES来绘制音频输入的波形,似乎没有更简单的方法来实现实时绘制。我将在 GLKView 内绘图。记录完某些内容后,用户应该能够来回滚动并查看没有毛刺的波形。我知道这是可行的,但很难理解如何实施。假设用户正在滚动,我是否需要每次重新读取录制的音频并重新绘制所有内容?我显然不想将整个录音存储在内存中,并且从磁盘读取速度很慢。
2)对于滚动等,用户应该看到一个时间线,如果我知道第一个问题,我不知道如何实现时间线。
我描述的所有功能都是可行的,因为它可以在语音备忘录应用程序中看到。任何帮助总是值得赞赏。
我想当耳机插入 iOS 设备时直接将录制的音频播放到扬声器。
我所做的是AudioUnitRender在AURenderCallbackfunc 中调用,以便将音频数据写入 AudioBuffer 结构。
如果“IO 缓冲持续时间”未设置或设置为 0.020 秒,则效果良好。如果通过调用将“IO缓冲区持续时间”设置为较小的值(0.005等)setPreferredIOBufferDuration,AudioUnitRender()将返回错误:
kAudioUnitErr_CannotDoInCurrentContext (-10863)。
任何人都可以帮助找出原因以及如何解决它吗?谢谢
我在 macOS 上开发 VoIP 应用程序,并使用 VoiceProcessingIO 音频单元进行音频处理,例如回声消除和自动增益控制。
问题是,当我初始化音频单元时,核心音频设备列表发生变化 - 不仅仅是添加 VP 音频单元满足其需要的新聚合设备,而且还因为内置输出设备(即“内置 - MacBook Pro”)扬声器”)现在也显示为输入设备,即除了输出流之外还有意外的输入流。
这是我在初始化 VP AU 之前从 Core Audio 获得的输入设备(又名“麦克风”)列表:
DEVICE: INPUT 45 BlackHole_UID
DEVICE: INPUT 93 BuiltInMicrophoneDevice
Run Code Online (Sandbox Code Playgroud)
这是我的 VP AU 初始化时的相同列表:
DEVICE: INPUT 45 BlackHole_UID
DEVICE: INPUT 93 BuiltInMicrophoneDevice
DEVICE: INPUT 86 BuiltInSpeakerDevice /// WHY?
DEVICE: INPUT 98 VPAUAggregateAudioDevice-0x101046040
Run Code Online (Sandbox Code Playgroud)
这是非常令人沮丧的,因为我需要在应用程序中显示设备列表,尽管我可以从设备列表中大胆地过滤掉聚合设备(无论如何它们都不能与 VP AU 一起使用),但我无法排除我们的内置 MacBook 扬声器设备。
也许你们中的某个人已经经历过这个并知道发生了什么以及是否可以解决这个问题。我需要注意一些 kAudioObjectPropertyXX 以从输入列表中排除设备。当然,这可能是苹果方面的一个错误/功能,我只需要想办法解决这个问题。
VP AU 运行良好,尽管使用了设备(我在内置和外部/USB/蓝牙等设备上尝试过),但问题仍然存在。该问题在我可以测试的所有 macOS 版本上都会重现,从 10.13 开始到 11.0 结束。这也会在不同的 Mac 和连接的不同音频设备组上重现。我很好奇,关于这个问题的可用信息几乎为零,这让我想到我做错了什么。
更奇怪的是,当 VP AU 工作时,HALLLab 应用程序指示另一件事:内置输入有两个以上的输入流(好吧,如果只是这样的话,我会幸存下来!)。但它并不表明内置输出已添加输入流,就像在我的应用程序中一样。
以下是有关如何设置 VP 音频单元的 …
如果有人可以发布或指导我对其中一个系统提供的音频单元的简单实现,我会喜欢它.我想在iOS中使用AUPitch(iPhone是否支持该单元?)并且似乎没有任何关于如何使用它的简单描述.
提前致谢,
mIL3S
我正在尝试使用远程IO连接并通过内置过滤器效果(仅限iOS 5)路由音频输入,然后退出硬件.我可以让它从输入直接路由到输出,但我无法让过滤器工作.我不确定它是滤波器音频单元还是路由器我错了.
这个位只是我尝试设置过滤器和更改路由以便数据处理它.
任何帮助表示赞赏.
// ******* BEGIN FILTER ********
NSLog(@"Begin filter");
// Creates Audio Component Description - Output Filter
AudioComponentDescription filterCompDesc;
filterCompDesc .componentType = kAudioUnitType_Effect;
filterCompDesc.componentSubType = kAudioUnitSubType_LowPassFilter;
filterCompDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
filterCompDesc.componentFlags = 1;
filterCompDesc.componentFlagsMask = 1;
// Create Filter Unit
AudioUnit lpFilterUnit;
AudioComponent filterComponent = AudioComponentFindNext(NULL, &filterCompDesc);
setupErr = AudioComponentInstanceNew(filterComponent, &lpFilterUnit);
NSAssert(setupErr == noErr, @"No instance of filter");
AudioUnitElement bus2 = 2;
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Output, bus2, &oneFlag, sizeof(oneFlag));
AudioUnitElement bus3 = 3;
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Input, …Run Code Online (Sandbox Code Playgroud) 我想知道音频单元在缓冲区中期望的值.现在,当我在一个振幅为0.5的单一频率上计算正弦波的样本时,一切正常.
但是,当我想同时播放几个频率时,例如同时播放5个频率,我将样本混合在一起,将样本混合起来,样本值变高,声音不再干净.
所以我想知道在我开始收到脏声之前我的最大样本值是多少.
在iOS 11中需要有关Audio Units的帮助.我有两个iOS应用程序:一个提供V3音频单元的应用程序和一个用于Audio Units的主机应用程序.问题是,当我使用iOS 11 SDK在Xcode 9.0中编译主机应用程序并在带有iOS 11的iPhone上运行它时,主机应用程序看不到音频单元.
我做了一些研究,这就是我得到的:问题影响任何音频单元应用程序,而不仅仅是这两个特定的应用程序.如果您使用Apple网站上的AudioUnitV3Example项目(https://developer.apple.com/library/content/samplecode/AudioUnitV3Example/Introduction/Intro.html),您可以轻松地看到同样的问题.此示例项目包含两个应用程序:iOSAUv3Host和提供音频单元应用程序扩展的iOSFilterDemoApp.您需要在iOS设备上安装这两个应用程序.
当您启动AUv3Host应用程序时,它将显示系统中所有可用音频单元的列表:
我还使用iOS 10 SDK(来自https://developer.apple.com/download/more/)下载了Xcode 8.3.3,并尝试了构建SDK和设备的iOS版本的所有可能配置.这是我得到的: