ios核心音频: modifying aurioTouch to save pcm data

标签 ios core-audio

作为练习,我正在尝试修改 aurioTouch,以便它保存通过麦克风进入的 PCM 的前 60 秒。我避免使用更高级别的库,因为我想在此基础上构建一些低延迟的实时处理。我通过简单地创建一个大的 saveBuffer 来做到这一点,然后简单地为每次调用 PerformThru 的每个“inNumberFrames”附加存储在 drawBuffers[] 中的 data_ptr[2] 值......然后,在 60 秒过去后,我转储一次缓冲到磁盘。

我通过输入一致的点击来尝试这段代码。问题是,当我在 gnuplot 中可视化这个 saveBuffer 数据时,我在不均匀的时间得到峰值,从稳定的点击中减少了 30-40%,这意味着一些峰值靠得很近,而另一些则相距很远。我可以看到输入点击 .wav 并且它非常均匀,但是 saveBuffer 图有奇怪的峰值。这让我想知道我是否正确保存了 pcm 数据?也许我以某种方式花费了太长时间并因此丢失了数据?

我对 PerformThru() 的更改:

{ //分配缓冲区 static int *saveBuffer = ( int * ) malloc( 10000000 * sizeof( int ) ); . . .

    SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData);

    for (i=0; i<inNumberFrames; i++)
    {
        if ((i+drawBufferIdx) >= drawBufferLen)
        {
            cycleOscilloscopeLines();
            drawBufferIdx = -i;
        }
        drawBuffers[0][i + drawBufferIdx] = data_ptr[2];

        // XXXX I added this line
        if ( saveBuffer ) { saveBuffer[ saveBufferIdx++ ] = ( data_ptr[ 2 ] ); }


        data_ptr += 4;
    }

    // XXX - I added this block:  dump saveBuffer after 60 seconds
    if ( saveBuffer && ( CAHostTimeBase::HostDeltaToNanos( initialHostTime, inTimeStamp->mHostTime ) / 1000000000 ) > 60 )
    {
        std::ofstream bufferOut;
        bufferOut.open( "pcmBuffer.txt" );
        for ( UInt64 i = 0; i < saveBufferIdx; i++ )
        {
            bufferOut << saveBuffer[ i ] << std::endl;
        }
        bufferOut.close();
        free( saveBuffer );
        saveBuffer = 0;
    }
    drawBufferIdx += inNumberFrames;
}

最佳答案

使用 CAMediaCurrentTime(媒体当前/当前媒体——我总是忘记哪个方向)

天哪,这个源代码太丑了,在 Apple 编写它的人在编写可读代码方面需要学习很多东西。它实际上被用作公共(public)样本的事实只是一个笑话。

看起来你做的一切都是对的。为什么不尝试禁用其他一切,只将样本送入缓冲区?

我在编写音高检测器时就这样做过,而且效果很好。一旦我有 30 秒的样本,我就将所有内容打印到控制台上,就像您保存到文件中一样。

我真的认为从头开始编写可视化工具有更多好处。 AurioTouch 是一团糟,弄清楚它的工作原理比实际构建一个需要更长的时间。

关于ios核心音频: modifying aurioTouch to save pcm data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146211/

相关文章:

ios - 在 Swift 中以编程方式定位(Twitter Digits 的)按钮

iphone - 将图像添加到ios中的“事件”指示器中

ios - 选择器没有已知的类方法 'name'

ruby - 在 Mac 上生成音调/正弦波的简单方法? ( ruby 会很好)

objective-c - AudioFileOpen无法以读/写权限打开

ios - 以编程方式关闭 VoiceProcessingIO AGC

ios - 从 iPad 上的浏览​​器打开视频的 URL 方案

ios - `UITabBarController` 切换标签时去除黑色背景

macos - 数字音频输出 - 它是什么格式?

iphone - 是否可以转换带有一些音符的音频文件?