菜鸟教程小白 发表于 2022-12-11 22:41:20

c++ - AudioOutputUnitStart 很慢


                                            <p><p>我有一个播放单声道音频事件的代码(各种频率的短哔声)。
我创建了一个 AudioOutputUnit,将其停止,并在我需要播放音频时停止。我启动它。当我播放了所需的时间时,我会停止它。</p>

<p>听起来很简单。</p>

<p>但是,在我的 iPhone 4S(使用 iOS 5.1)上,AudioOutputUnitStart 通常需要 180 毫秒才能返回,这太长了。</p>

<p>这里是 AudioOutputUnit 的创建/初始化</p>

<pre><code>void createAOU()
{
    m_init = false;
    // find the default playback output unit
    AudioComponentDescription defaultOutputDescription;
    defaultOutputDescription.componentType = kAudioUnitType_Output;
    defaultOutputDescription.componentSubType = kAudioUnitSubType_RemoteIO;
    defaultOutputDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
    defaultOutputDescription.componentFlags = 0;
    defaultOutputDescription.componentFlagsMask = 0;

    // Get the default playback output unit
    AudioComponent defaultOutput = AudioComponentFindNext(NULL, &amp;defaultOutputDescription);
    if (defaultOutput == NULL)
      return;

    OSErr err = AudioComponentInstanceNew(defaultOutput, &amp;m_toneUnit);
    if (err != noErr)
      return;

    // single channel, floating point, linear PCM
    AudioStreamBasicDescription streamFormat;
    streamFormat.mSampleRate = m_framerate;
    streamFormat.mFormatID = kAudioFormatLinearPCM;
    streamFormat.mFormatFlags =
    kLinearPCMFormatFlagIsFloat |
    kAudioFormatFlagsNativeEndian | kLinearPCMFormatFlagIsPacked;
    streamFormat.mBytesPerPacket = sizeof(float);
    streamFormat.mFramesPerPacket = 1;
    streamFormat.mBytesPerFrame = sizeof(float);
    streamFormat.mChannelsPerFrame = 1;
    streamFormat.mBitsPerChannel = sizeof(float) * 8;
    err = AudioUnitSetProperty (m_toneUnit,
                              kAudioUnitProperty_StreamFormat,
                              kAudioUnitScope_Input,
                              0,
                              &amp;streamFormat,
                              sizeof(AudioStreamBasicDescription));
    if (err != noErr)
      return;

    // Attach callback to default output
    AURenderCallbackStruct input;
    input.inputProc = RenderTone;
    input.inputProcRefCon = this;
    err = AudioUnitSetProperty(m_toneUnit,
                               kAudioUnitProperty_SetRenderCallback,
                               kAudioUnitScope_Input,
                               0,
                               &amp;input,
                               sizeof(input));
    if (err != noErr)
      return;

    float aBufferLength = 0.001; // In seconds
    AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,
                            sizeof(aBufferLength), &amp;aBufferLength);

    err = AudioUnitInitialize(m_toneUnit);
    if (err != noErr)
      return;
    reset();
    m_init = true;
}
</code></pre>

<p>要开始它,我只需调用:</p>

<pre><code>OSErr err = AudioOutputUnitStart(m_toneUnit);
</code></pre>

<p>完成后:</p>

<pre><code>OSErr err = AudioOutputUnitStop(m_toneUnit);
</code></pre>

<p>我尝试了各种方法:
将 kAudioSessionProperty_PreferredHardwareIOBufferDuration 属性设置为非常小的值(如 5 毫秒)
降低帧率(试过48kHz、44.1kHz、8kHz)</p>

<p>无论我做什么...
首次启动 audiounit 时,AudioOutputUnitStart 仅在 160-180 毫秒后返回。如果我立即停止并启动它,那么它只需要大约5m,这是可以接受的。</p>

<p>延迟在我的应用中是相当重要的,180ms 绝对不能接受。</p>

<p>有什么建议吗?
我见过一些人问过类似的问题,但他们通常都没有得到答案。</p>

<p>我希望这次会有所不同:)</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>处理音频单元启动延迟的方法是提前启动音频单元,而不是停止它。相反,只需为短缓冲区配置 Audio Session ,然后用静音填充音频单元渲染回调缓冲区,直到需要用所需的声音填充它们。然后在你的声音之后,回到用静音填充缓冲区而不是停止。</p></p>
                                   
                                                <p style="font-size: 20px;">关于c&#43;&#43; - AudioOutputUnitStart 很慢,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/10141526/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/10141526/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: c&#43;&#43; - AudioOutputUnitStart 很慢