【问题标题】:AudioQueue screws up output after modification修改后 AudioQueue 搞砸了输出
【发布时间】:2011-01-13 10:07:00
【问题描述】:

我目前正在开发音频 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);

}

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

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

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

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

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

非常感谢:-)

干杯,

曼卡

【问题讨论】:

    标签: iphone c++ ios core-audio


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多