gpt4 book ai didi

iphone - AudioQueue 在修改后搞砸了输出

转载 作者:太空宇宙 更新时间:2023-11-04 14:25:02 25 4
gpt4 key购买 nike

我目前正在开发音频 DSP 应用程序。该项目需要直接访问和修改音频数据。现在我可以使用 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);

}

在调试过程中,buffer中的数据按预期显示,但实际输出只是噪声。

以下是让整个团队疯狂的代码的其他一些奇怪行为:

  1. 如果数据没有变化(加/减 0,乘以 1)或整个缓冲区被分配给一个常量(比如 0,则音频将被静音),播放行为正常(当然!)但如果我执行的不仅仅是它,它仍然是噪音。

  2. 在我将单个音调硬编码为测试音频的情况下,输出噪声也会传播到另一个 channel 。

那么这段代码的bug在哪里呢?或者如果我在错误的轨道上,修改音频数据并正确执行播放的正确方法是什么?任何见解将不胜感激。

非常感谢:-)

干杯,

曼卡

最佳答案

您确定样本格式是 SInt16 吗?有多少个 channel ?您似乎将音频视为单 channel 短流,但假设格式实际上是双 channel Float32 左右,并且您在那里进行了修改,那么效果将完全如您所描述的,包括其他 channel 的噪音。

关于iphone - AudioQueue 在修改后搞砸了输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4678803/

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