私は最近、ユーザーが話し、その後、彼が話したことを変な声で再生できるゲームを作ろうと試みています。
問題は、誰かが iPhone の近くで話している場合にのみ録音が行われることです (私はこの部分を管理しており、レコーダーを常にアクティブにして平均値とピーク値を取得しています)。
問題は、ユーザーが言い返したことを再生したいときです。私は周りを探し回っていましたが、これを行う唯一の方法は、メモリに保存できるという事実により、Audio Queue Services のようです。私の見解では、サウンドをファイルに保存して再生すると、ファイルの割り当てが原因で問題が発生します。
メモリに保存する方法に関するチュートリアルが見つからなかったので、誰かがこれを行う方法またはファイルに保存して問題なく再生する方法を知っている場合 (今では、最初の 0.5 秒が聞こえなくなります)また、fps が 20 低下します)。
私の現在のコードは次のとおりです。
void AudioInputCallback(
void *inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp *inStartTime,
UInt32 inNumberPacketDescriptions,
const AudioStreamPacketDescription *inPacketDescs)
RecordState* recordState = (RecordState*)inUserData;
if(!recordState->recording)
{
printf("Not recording, returning\n");
}
printf("Writing buffer %d\n", (int)recordState->currentPacket);
//What to put here to save to memory?
recordState->currentPacket += inNumberPacketDescriptions;
AudioQueueEnqueueBuffer(recordState->queue, inBuffer, 0, NULL);
}
void AudioOutputCallback(
void* inUserData,
AudioQueueRef outAQ,
AudioQueueBufferRef outBuffer)
{
PlayState* playState = (PlayState*)inUserData;
if(!playState->playing)
{
printf("Not playing, returning\n");
return;
}
printf("Queuing buffer %d for playback\n",(int) playState->currentPacket);
AudioStreamPacketDescription* packetDescs;
UInt32 bytesRead;
UInt32 numPackets = 8000;
OSStatus status;
//What to put here to read from memory?
status = AudioQueueEnqueueBuffer(
playState->queue,
outBuffer,
0,
packetDescs);
playState->currentPacket += numPackets;
AudioQueueFreeBuffer(playState->queue, outBuffer);
}