当前位置: 首页 > 知识库问答 >
问题:

如何在iOS上使用AudioUnit.Framework配置框架

云霖
2023-03-14

我有一个音频应用程序,我需要捕捉麦克风样本编码到mp3与ffmpeg

首先配置音频:

/**  
     * We need to specifie our format on which we want to work.
     * We use Linear PCM cause its uncompressed and we work on raw data.
     * for more informations check.
     * 
     * We want 16 bits, 2 bytes (short bytes) per packet/frames at 8khz 
     */
    AudioStreamBasicDescription audioFormat;
    audioFormat.mSampleRate         = SAMPLE_RATE;
    audioFormat.mFormatID           = kAudioFormatLinearPCM;
    audioFormat.mFormatFlags        = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger;
    audioFormat.mFramesPerPacket    = 1;
    audioFormat.mChannelsPerFrame   = 1;
    audioFormat.mBitsPerChannel     = audioFormat.mChannelsPerFrame*sizeof(SInt16)*8;
    audioFormat.mBytesPerPacket     = audioFormat.mChannelsPerFrame*sizeof(SInt16);
    audioFormat.mBytesPerFrame      = audioFormat.mChannelsPerFrame*sizeof(SInt16);
static OSStatus recordingCallback(void *inRefCon, 
                                  AudioUnitRenderActionFlags *ioActionFlags, 
                                  const AudioTimeStamp *inTimeStamp, 
                                  UInt32 inBusNumber, 
                                  UInt32 inNumberFrames, 
                                  AudioBufferList *ioData) 
{
    NSLog(@"Log record: %lu", inBusNumber);
    NSLog(@"Log record: %lu", inNumberFrames);
    NSLog(@"Log record: %lu", (UInt32)inTimeStamp);

    // the data gets rendered here
    AudioBuffer buffer;

    // a variable where we check the status
    OSStatus status;

    /**
     This is the reference to the object who owns the callback.
     */
    AudioProcessor *audioProcessor = (__bridge AudioProcessor*) inRefCon;

    /**
     on this point we define the number of channels, which is mono
     for the iphone. the number of frames is usally 512 or 1024.
     */
    buffer.mDataByteSize = inNumberFrames * sizeof(SInt16); // sample size
    buffer.mNumberChannels = 1; // one channel

    buffer.mData = malloc( inNumberFrames * sizeof(SInt16) ); // buffer size

    // we put our buffer into a bufferlist array for rendering
    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0] = buffer;

    // render input and check for error
    status = AudioUnitRender([audioProcessor audioUnit], ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList);
    [audioProcessor hasError:status:__FILE__:__LINE__];

    // process the bufferlist in the audio processor
    [audioProcessor processBuffer:&bufferList];

    // clean up the buffer
    free(bufferList.mBuffers[0].mData);


    //NSLog(@"RECORD");
    return noErr;
}

共有1个答案

薛欣德
2023-03-14

您可以使用属性KAudiounitProperty_MaximumFramesPerslice配置AudioUnit将使用的每片帧数。然而,我认为在您的情况下最好的解决方案是将传入的音频缓冲到环形缓冲区,然后通知您的编码器音频可用。因为你是转码到MP3,我不知道实时在这种情况下意味着什么。

 类似资料:
  • 问题内容: 我必须对ffmpeg使用以下命令 我已经在Mac上成功安装了ffmpeg。我尝试使用FFMPEGWrapper,但是使用“ map”似乎没有任何此类参数。 我需要知道如何从视频中提取流。我已经可以访问流了,因为服务器端在端使用ffprobe向我提供了这些流。 问题答案: 将FFMpeg用于IOS的最佳方法是MobileFFMpeg库。 这是来源:https : //github.com

  • 我想在linux jenkins中配置IOS项目作业。在没有OSX PC的情况下,是否可以在Linux Jenkins中配置IOS作业。

  • 任何关于如何做到这一点的文件都将不胜感激。 提前谢了。

  • 我下载并安装git从:https://git-scm.com/downloads.我现在可以在Windows命令提示符上使用git。 我下载了puttygen并用它生成了一对RSA密钥,存储在 我将公钥添加到我公司的git网站。 现在,我如何告诉git使用我刚刚创建的rsa密钥?

  • 问题内容: 我想在应用程序委托中设置rootViewController .. 问题答案: 你可以做这样的事情。

  • 本文向大家介绍如何在Ubuntu 16.04上使用'rbenv'设置和配置Ruby on Rails,包括了如何在Ubuntu 16.04上使用'rbenv'设置和配置Ruby on Rails的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将学习如何设置和配置Ruby on Rails,它是开发人员用来创建站点和Web应用程序的最流行的堆栈应用程序。Ruby是一种编程语言,程序员可以将它