我目前正致力于音频DSP App开发。该项目需要直接访问和修改音频数据。现在我可以使用AudioQueue成功访问和修改原始音频数据,但在播放期间遇到错误。任何修改后的输出音频都是噪音。
简而言之,代码是这样的:
(从Speakhere示例代码修改。其余部分保持不变。)
void AQPlayer::AQBufferCallback(void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inCompleteAQBuffer)
{
AQPlayer *THIS = (AQPlayer *)inUserData;
if (THIS->mIsDone) return;
UInt32 numBytes;
UInt32 nPackets = THIS->GetNumPacketsToRead();
OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(),
false,
&numBytes,
inCompleteAQBuffer->mPacketDescriptions,
THIS->GetCurrentPacket(),
&nPackets,
inCompleteAQBuffer->mAudioData);
if (result)
printf("AudioFileReadPackets failed: %d", (int)result);
if (nPackets > 0) {
inCompleteAQBuffer->mAudioDataByteSize = numBytes;
inCompleteAQBuffer->mPacketDescriptionCount = nPackets;
//My modification starts from here
//Modifying audio data
SInt16 *testBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;
for (int i = 0; i < (inCompleteAQBuffer->mAudioDataByteSize)/sizeof(SInt16); i++)
{
//printf("before modification %d", (int)*testBuffer);
*testBuffer = (SInt16) *testBuffer/2; //Say some simple modification
//printf("after modification %d", (int)*testBuffer);
testBuffer++;
}
AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL);
}
在调试期间,缓冲区中的数据按预期显示,但实际输出只是噪声。
以下是代码中的一些其他奇怪行为,这使得整个团队都疯狂:
如果数据没有变化(加/减0,乘以1)或者整个缓冲区被分配给一个常量(比如0,那么音频将被静音),播放行为正常(当然!)但是如果我执行的不仅仅是它,它仍然是噪音。
在我将单个音调硬编码为测试音频的情况下,输出噪音也会传播到另一个频道。
那么这段代码中的错误在哪里?或者,如果我在错误的轨道上,修改音频数据和正确执行播放的正确方法是什么?任何见解都将得到真诚的感谢。
非常感谢: - )
干杯,
曼卡
答案 0 :(得分:0)
你确定样本格式是SInt16吗?那里有多少个频道?您似乎将音频视为单通道短流,但假设格式实际上是双通道Float32左右,并且您在那里进行修改,而不是如您所描述的那样完全的效果,包括其他渠道的噪音。