gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:46:51 25 4
gpt4 key购买 nike

作为练习,我正在尝试修改 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com