标签: audiounit

如何录制混音器单元输出产生的声音(iOS Core Audio&Audio Graph)

我正在尝试录制混音器单元输出产生的声音.

目前,我的代码基于Apple MixerHost iOS应用程序演示:混音器节点连接到音频图形上的远程IO节点.

我尝试在混音器输出上的远程IO节点输入上设置输入回调.

我做错了什么,但我找不到错误.

这是下面的代码.这是在多通道混音器单元设置之后完成的:

UInt32 flag = 1;

// Enable IO for playback
result = AudioUnitSetProperty(iOUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 
                              0, // Output bus
                              &flag, 
                              sizeof(flag));
if (noErr != result) {[self printErrorMessage: @"AudioUnitSetProperty EnableIO" withStatus: result]; return;}

/* can't do that because *** AudioUnitSetProperty EnableIO error: -1073752493 00000000
result = AudioUnitSetProperty(iOUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 
                              0, // Output bus
                              &flag, 
                              sizeof(flag));
if (noErr != result) {[self printErrorMessage: @"AudioUnitSetProperty EnableIO" withStatus: result]; …
Run Code Online (Sandbox Code Playgroud)

iphone core-audio audio-recording audiounit ios

14
推荐指数
1
解决办法
9806
查看次数

有没有办法关闭iOS 6.0上音频输入的自动低频滤波?

我正在开发一款应用程序,可以使用iOS 6.0 SDK分析来自iPhone/iPad上内置麦克风的传入音频.

我一直在用较低频率(即低于200赫兹)的低水平挣扎一段时间,我(在网上)发现其他人有相同的问题而没有任何问题的答案.

各种使用iOS音频工具的公司表示,(在iOS 6.0之前)有一个内置的低频滚降滤波器,它在较低的频率上引起这些低信号.但这些信号源也表明从iOS 6.0开始,它应该是可以关闭输入音频信号的这种自动低频滤波.

我已经浏览了音频单元头文件,Xcode中的音频文档以及与音频相关的示例代码,但没有成功.我已经使用了AudioUnit的不同参数和属性(提到了低通滤波器等)而没有解决问题.

有谁知道如何关闭iOS 6.0中RemoteIO输入的自动低频滚降滤波器?

iphone audio ipad audiounit

12
推荐指数
2
解决办法
4576
查看次数

如何从OS X二进制文件中删除Objective-C符号?

好的,我知道还有其他帖子关于你怎么不能从OS X二进制文件中实际删除Objective-C符号,因为它们对于Obj-C来说是必要的,但我的情况有点不同.

我有一个二进制文件,它是一个包.它既可以用作VST插件,也可以用作AudioUnit插件.这个想法是二进制包含所有这两种格式的入口点,你只编译一次,然后将其命名一个副本" .VST "为VST版本,而" .component "为AU版本. (这是使用JUCE框架BTW.)

问题是对于AU方面,您必须导出Obj-C类以创建Cocoa UI视图.在VST方面,永远不会使用此类.但是如果你有像Ableton Live这样的主机允许你同时加载同一个插件的AU和VST版本,那么现在我们遇到了典型的Obj-C命名空间冲突问题.

在VST方面,特定的Obj-C类永远不会被使用.所以我想做的是使用"strip"从生成的二进制文件中删除那些Obj-C类.这仍然保留了为两种格式只编译一次的优点.

无论如何,我已经尝试过使用"strip -R stripfile.txt <path to binary>",其中stripfile.txt包含我想要删除的符号,但它始终无法说明在二进制文件中找不到符号.我已经尝试在条带文件中修改名称,但这没有帮助(或者我做错了).

以下是我想要剥离的相关符号,作为"nm -m"的输出:

000000000003bb00 (__TEXT,__text) non-external -[JuceDemoProjectAU description]
000000000003bb60 (__TEXT,__text) non-external -[JuceDemoProjectAU interfaceVersion]
000000000003ba00 (__TEXT,__text) non-external -[JuceDemoProjectAU uiViewForAudioUnit:withSize:]
0000000000b02398 (__DATA,__objc_data) external _OBJC_CLASS_$_JuceDemoProjectAU
0000000000b023c0 (__DATA,__objc_data) external _OBJC_METACLASS_$_JuceDemoProjectAU
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

顺便说一下,我随后能够动态注册有问题的类(使用唯一的名称),这也解决了这个问题.但是,如果我可以开始工作,我可以为现有的二进制文件部署解决方案.

cocoa objective-c vst audiounit

12
推荐指数
1
解决办法
1127
查看次数

AVAudioEngine中的Vexing崩溃

我编写了以下AVAudioEngine代码,用于初始化我的一个自定义AUAudioUnit子类并将其连接到引擎的主混音器节点.

class AudioEngine {

    let engine = AVAudioEngine()

    init() {

        let sess = AVAudioSession.sharedInstance()
        try! sess.setCategory(AVAudioSessionCategoryPlayback)
        try! sess.setActive(true)


        let desc = AudioComponentDescription(componentType: kAudioUnitType_Generator, componentSubType: 0x00000001, componentManufacturer: 0x00000002, componentFlags: 0, componentFlagsMask: 0)

        AUAudioUnit.registerSubclass(MyAudioUnit.self, as: desc, name: "MyAudioUnit", version: 2)


        let format = engine.outputNode.outputFormat(forBus: 0)

        engine.connect(engine.mainMixerNode, to: engine.outputNode, format: format)

        AVAudioUnit.instantiate(with: desc, options: []) { (audiounit, error) in

            guard let au = audiounit else { return }

            self.engine.attach(au)
            let stereoFormat = AVAudioFormat(standardFormatWithSampleRate: format.sampleRate, channels: 2)

            // CRASHES HERE
            self.engine.connect(au, to: …
Run Code Online (Sandbox Code Playgroud)

core-audio audiounit avaudioengine

12
推荐指数
0
解决办法
406
查看次数

iPhone:AudioBufferList初始化和发布

使用3个AudioBuffers初始化(分配内存)和释放(释放)AudioBufferList的正确方法是什么?(我知道可能有多种方法可以做到这一点.)

我想使用这3个缓冲区来读取音频文件的连续部分并使用音频单元播放它们.

iphone core-audio audiounit ios

11
推荐指数
2
解决办法
1万
查看次数

任何人都可以帮助我通过音频单元录制iPhone输出声音

这是我的代码:我使用此代码通过使用音频单元记录iPhone输出音频,然后将输出保存在output.caf中,但output.caf文件为空,任何人都知道我该怎么办?输出音频文件为空

这是音频单元的初始化

-(void) initializaeOutputUnit
{
    OSStatus status;

    // Describe audio component
    AudioComponentDescription desc;
    desc.componentType = kAudioUnitType_Output;
    desc.componentSubType = kAudioUnitSubType_RemoteIO;
    desc.componentFlags = 0;
    desc.componentFlagsMask = 0;
    desc.componentManufacturer = kAudioUnitManufacturer_Apple;

    // Get component
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);

    // Get audio units
    status = AudioComponentInstanceNew(inputComponent, &audioUnit);

    // Enable IO for recording
    UInt32 flag = 1;
    status = AudioUnitSetProperty(audioUnit, 
                                  kAudioOutputUnitProperty_EnableIO, 
                                  kAudioUnitScope_Input, 
                                  kInputBus,
                                  &flag, 
                                  sizeof(flag));

    // Enable IO for playback
    status = AudioUnitSetProperty(audioUnit, 
                                  kAudioOutputUnitProperty_EnableIO, 
                                  kAudioUnitScope_Output, 
                                  kOutputBus,
                                  &flag, 
                                  sizeof(flag));

    // Describe format
    AudioStreamBasicDescription audioFormat={0};
    audioFormat.mSampleRate …
Run Code Online (Sandbox Code Playgroud)

iphone core-audio audiounit ios5

11
推荐指数
1
解决办法
7766
查看次数

在iPhone 5上选择后麦克风

RemoteIO设备有没有办法在iPhone 5上拿回麦克风?我可以配置AVAudioSession在前置麦克风或底部麦克风之间进行选择,但我找不到选择后置麦克风的方法.

AVFoundation framework确定了使用视频录制的背部麦克风使用后置摄像头的时候,但我希望的方式来选择使用相同的CoreAudio的.那可能吗 ?

iphone core-audio avfoundation audiounit remoteio

11
推荐指数
1
解决办法
1882
查看次数

转到后台并返回前台后无法继续从AVAssetReaderOutput读取

我正在使用a AVAssetReaderOutput来读取a中的样本AVAsset,对它们进行一些处理,并使用RemoteIO AU播放结果.

问题是,在调用AudioOutputUnitStop暂停播放后,在转到后台并返回前台后,调用后音频将不会再次启动AudioOutputUnitStart.这是由于copyNextSampleBuffer方法返回的错误,该错误AVAssetReaderOutput被称为渲染管道的一部分.

调用之后的status属性是,其属性为Error Domain = AVFoundationErrorDomain Code = -11847"Operation Interrupted"UserInfo = 0x1d8b6100 {NSLocalizedRecoverySuggestion =停止其他操作并再试一次.,NSLocalizedDescription = Operation Interrupted}AVAssetReadercopyNextSampleBufferAVAssetReaderStatusFailederror

我正在寻找一种解决方案,它不会强迫我在回到前台后重新初始化整个管道 - 希望有这样一个解决方案,AVAssetReaders可以在应用程序进入后台并返回...

笔记

  • 该应用程序有权在后台播放音频.
  • 我正在处理音频中断 - AVAudioSessionAVAudioSessionDelegates endInterruptionWithFlags:事件和应用程序变为活动状态时将我设置为活动状态.无论我是否这样做都没有区别,得到同样的错误.

一些代码:

AudioPlayer

@implementation AudioPlayer
    ...
// Audio Unit Setup
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;

AudioComponent defaultOutput …
Run Code Online (Sandbox Code Playgroud)

core-audio audiounit ios avassetreader

11
推荐指数
1
解决办法
3719
查看次数

iOS AudioUnit以8kHz采样率录制,静音

我正在构建一个voip应用程序,我们需要从麦克风录制音频并以8kHz采样率发送到某处.现在我以默认采样率录制它,在我的情况下总是为44,4k.然后使用此算法将其手动转换为8k .

这种天真的方法产生了"正常"的质量,但我认为使用AudioUnit的原生下采样功能会好得多.

但是当我更改录音AudioUnit上的采样率属性时,它只输出静音帧(~0.0),我不知道为什么.

我已经提取了负责声音的应用程序部分.它应该从麦克风录制 - >写入环形缓冲区 - >播放缓冲区中的数据:

RecordingUnit:

import Foundation
import AudioToolbox
import AVFoundation

class RecordingUnit : NSObject
{
    public static let AudioPacketDataSize = 160
    public static var instance: RecordingUnit!
    public var micBuffers : AudioBufferList?;
    public var OutputBuffer = RingBuffer<Float>(count: 1 * 1000 * AudioPacketDataSize);

    public var currentAudioUnit: AudioUnit?

    override init()
    {
        super.init()
        RecordingUnit.instance = self

        micBuffers = AudioBufferList(
            mNumberBuffers: 1,
            mBuffers: AudioBuffer(
                mNumberChannels: UInt32(1),
                mDataByteSize: UInt32(1024),
                mData: UnsafeMutableRawPointer.allocate(byteCount: 1024, alignment: 1)))
    }

    public func start() …
Run Code Online (Sandbox Code Playgroud)

audio downsampling audiounit ios swift

11
推荐指数
0
解决办法
321
查看次数

从IO单元将音频写入磁盘

重写这个问题会更有吸引力.

我的问题是我无法从远程IO单元成功地将音频文件写入磁盘.

我采取的步骤是

打开一个mp3文件并将其音频提取到缓冲区.我根据图表的属性设置了一个asbd用于我的图形.我设置并运行我的图形循环提取的音频和声音成功地从扬声器出来!

我遇到的困难是从远程IO回调中获取音频样本并将其写入磁盘上的音频文件,我正在使用ExtAudioFileWriteASync.

音频文件确实被写入并且与原始mp3有一些可听见的相似之处,但听起来非常扭曲.

我不确定问题是否存在

A)ExtAudioFileWriteAsync无法像io单元回调提供的那样快速写入样本.

  • 要么 -

B)我已经为extaudiofile refeference设置了ASBD错误.我想先保存一个wav文件.我不确定我是否在下面的ASBD中正确描述了这一点.

其次,我不确定在创建音频文件时为inChannelLayout属性传递什么值.

最后我非常不确定要用于kExtAudioFileProperty_ClientDataFormat的asbd.我一直在使用我的立体声流格式,但仔细看看文档说这必须是pcm.它应该与remoteio的输出格式相同吗?如果是这样,我错误地将远程io的输出格式设置为stereostreamformat?

我意识到这个问题有很多,但我有很多不确定因素,我似乎无法自行解决.

设置立体声流格式

- (void) setupStereoStreamFormat
{

    size_t bytesPerSample = sizeof (AudioUnitSampleType);
    stereoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
    stereoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
    stereoStreamFormat.mBytesPerPacket    = bytesPerSample;
    stereoStreamFormat.mFramesPerPacket   = 1;
    stereoStreamFormat.mBytesPerFrame     = bytesPerSample;
    stereoStreamFormat.mChannelsPerFrame  = 2;                    // 2 indicates stereo
    stereoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
    stereoStreamFormat.mSampleRate        = engineDescribtion.samplerate;

    NSLog (@"The stereo stereo format :");


}
Run Code Online (Sandbox Code Playgroud)

使用立体声流格式设置remoteio回调

AudioUnitSetProperty(engineDescribtion.masterChannelMixerUnit, 
                             kAudioUnitProperty_StreamFormat, 
                             kAudioUnitScope_Output, 
                             masterChannelMixerUnitloop, 
                             &stereoStreamFormat, 
                             sizeof(stereoStreamFormat));

        AudioUnitSetProperty(engineDescribtion.masterChannelMixerUnit, 
                             kAudioUnitProperty_StreamFormat, 
                             kAudioUnitScope_Input, 
                             masterChannelMixerUnitloop, 
                             &stereoStreamFormat, 
                             sizeof(stereoStreamFormat));




static OSStatus masterChannelMixerUnitCallback(void *inRefCon, 
                              AudioUnitRenderActionFlags …
Run Code Online (Sandbox Code Playgroud)

iphone core-audio audiounit ios

10
推荐指数
1
解决办法
5436
查看次数