ios核心音频:修改aurioTouch以保存pcm数据
作为练习,我试图修改aurioTouch,以便通过麦克风节省前60秒的PCM。 我正在避免更高级别的库,因为我想在此基础上构建一些低延迟的实时处理。 我通过简单地创建一个大的saveBuffer,然后简单地追加存储在drawBuffers []中的data_ptr [2]值为每个“inNumberFrames”每次调用PerformThru ...然后,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(媒体当前/当前媒体 - 我总是忘记哪个方向)
天哪,这个源代码屁股很丑陋,无论是谁在苹果公司编写它都有很多东西需要学习编写可读代码。 它实际上用作公共样本的事实只是一个笑话。
它看起来像你正在做的一切正确。 你为什么不尝试禁用其他所有东西,只将样本送入缓冲区?
我在写一个音高探测器时已经完成了这项工作,并且工作正常。 一旦我有30秒的样本,我就把所有东西都打印到控制台上,就像保存到文件一样。
我真的认为从头开始编码可视化器会有更多好处。 AurioTouch是一团糟,需要花费更长时间才能找出它的工作原理,然后才能真正建立一个。
链接地址: http://www.djcxy.com/p/67017.html