2

音のエネルギーを使用してマイクから 1 分あたりの拍数 (BPM) を決定しようとしています。BPM を決定する部分はわかったと思いますが、RAW データを取得するのに少し問題があります。

この例は、Apples SpeakHere アプリに基づいています - 私が使用している AudioQueue コールバック関数:

SInt16 *buffer = (SInt16*)inBuffer->mAudioData;   
for (int i = 0; i < (inBuffer->mAudioDataByteSize)/sizeof(SInt16); i++)
{      
  printf("before modification %d\n", (int)*buffer); 
  buffer++;
}  

しかし、私はいくつかの興味深い値を取得しています - 誰かが私が間違っている場所の正しい方向に私を向けて、私が返すべき範囲を教えてくれる可能性があります.

オーディオ形式のセットアップ:

mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
mRecordFormat.mBitsPerChannel = 16;
mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel / 8) * mRecordFormat.mChannelsPerFrame;
mRecordFormat.mFramesPerPacket = 1;

乾杯、

4

2 に答える 2

1

解決...

オーディオ形式のセットアップ:

mRecordFormat.mFormatID = kAudioFormatLinearPCM;
mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
mRecordFormat.mBitsPerChannel = 16;
mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel / 8) * mRecordFormat.mChannelsPerFrame;
mRecordFormat.mFramesPerPacket = 1;
mRecordFormat.mBytesPerPacket = 2 * mRecordFormat.mChannelsPerFrame;
mRecordFormat.mBytesPerFrame = 2 * mRecordFormat.mChannelsPerFrame;
mRecordFormat.mFramesPerPacket = 1;
mRecordFormat.mReserved = 0;

そして今、それを繰り返します:

int sampleCount = inBuffer->mAudioDataBytesCapacity / sizeof (SInt16);
SInt16 *p = (SInt16*)inBuffer->mAudioData;
for (int i = 0; i < sampleCount; i++) {    
 SInt16 val = p[i];
}
于 2011-05-06T12:34:07.693 に答える
0

どの形式 (AudioStreamBasicDescription: エンディアン、チャンネルあたりのビット数、フレームあたりのチャンネルなど) で Audio Queue を設定しましたか? 構成が SInt16 の C 配列とは大きく異なる可能性があります。

于 2011-05-05T17:49:21.547 に答える