首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioUnit输入样本

AudioUnit输入样本
EN

Stack Overflow用户
提问于 2012-06-26 18:40:23
回答 2查看 5.6K关注 0票数 4

所以我在这里遇到了一些麻烦,我的AudioUnit从iOS中的麦克风/线路接收数据。我能够设置所有我认为没有问题的东西,并调用我的recordingCallback,但是我从缓冲区中得到的数据是不正确的。它总是返回完全相同的东西,主要是零和随机大数。有没有人知道是什么导致了这一切。我的代码如下。

设置音频单元

代码语言:javascript
复制
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);
status = AudioComponentInstanceNew(inputComponent, &audioUnit);

// Enable IO for recording
UInt32 flag = 1;
status = AudioUnitSetProperty(audioUnit, 
                              kAudioOutputUnitProperty_EnableIO, 
                              kAudioUnitScope_Input, 
                              kInputBusNumber,
                              &flag, 
                              sizeof(flag));
// Disable playback IO
flag = 0;
status = AudioUnitSetProperty(audioUnit, 
                              kAudioOutputUnitProperty_EnableIO, 
                              kAudioUnitScope_Output, 
                              kOutputBusNumber,
                              &flag, 
                              sizeof(flag));

// Describe format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate         = 44100.00;
audioFormat.mFormatID           = kAudioFormatLinearPCM;
audioFormat.mFormatFlags        = kAudioFormatFlagsNativeFloatPacked |kAudioFormatFlagIsNonInterleaved;
audioFormat.mFramesPerPacket    = 1;
audioFormat.mChannelsPerFrame   = 1;
audioFormat.mBitsPerChannel     = 32;
audioFormat.mBytesPerPacket     = 4;
audioFormat.mBytesPerFrame      = 4;

// Apply format
status = AudioUnitSetProperty(audioUnit, 
                              kAudioUnitProperty_StreamFormat, 
                              kAudioUnitScope_Output, 
                              kInputBusNumber, 
                              &audioFormat, 
                              sizeof(audioFormat));

// Set input callback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = recordingCallback;
callbackStruct.inputProcRefCon = (__bridge void*)self;
status = AudioUnitSetProperty(audioUnit, 
                              kAudioOutputUnitProperty_SetInputCallback, 
                              kAudioUnitScope_Global, 
                              kInputBusNumber, 
                              &callbackStruct, 
                              sizeof(callbackStruct));
status = AudioUnitInitialize(audioUnit);

输入回调

代码语言:javascript
复制
static OSStatus recordingCallback(void *inRefCon, 
                                  AudioUnitRenderActionFlags *ioActionFlags, 
                                  const AudioTimeStamp *inTimeStamp, 
                                  UInt32 inBusNumber, 
                                  UInt32 inNumberFrames, 
                                  AudioBufferList *ioData) {

    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0].mDataByteSize = 4;
    bufferList.mBuffers[0].mNumberChannels = 1;
    bufferList.mBuffers[0].mData = malloc(sizeof(float)*inNumberFrames); //
    InputAudio *input = (__bridge InputAudio*)inRefCon;

    OSStatus status;

    status = AudioUnitRender([input audioUnit], 
                             ioActionFlags, 
                             inTimeStamp, 
                             inBusNumber, 
                             inNumberFrames, 
                             &bufferList);

    float* result = (float*)&bufferList.mBuffers[0].mData;

    if (input->counter == 5) {
        for (int i = 0;i<inNumberFrames;i++) {
            printf("%f ",result[i]);
        }
    }
    input->counter++;
    return noErr;
}

任何人都会遇到类似的问题,或者在我的代码中看到一些明显的错误。提前感谢您的帮助!

我所有的一切都是基于Michael核心音频RemoteIO代码

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-26 21:25:06

如果我没记错的话,您从回调中的音频缓冲区获得的示例不是浮动的,它们是SInt16。试着用这样的方法来铸造这些样本:

代码语言:javascript
复制
SInt16 *sn16AudioData= (SInt16 *)(bufferList.mBuffers[0].mData);

这些应该是最大值和最小值:

代码语言:javascript
复制
#define sn16_MAX_SAMPLE_VALUE 32767
#define sn16_MIN_SAMPLE_VALUE -32768
票数 2
EN

Stack Overflow用户

发布于 2012-06-29 16:23:21

我基本上试着用非常相似的代码做同样的事情,但是使用AudioGraph()。我也有同样的问题,从麦克风输出数据的零,直到我添加行后才能使它工作。

代码语言:javascript
复制
Status = AUGraphConnectNodeInput(graph, ioNode, 1, ioNode, 0);

由于没有使用图形,因此需要使用AudioUnitSetProperty() n调用kAudioUnitProperty_MakeConnectio,并传递和传递一个完整的AudioUnitConnection结构

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11213920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档