【问题标题】:Audio Queue Services callback: AudioStreamPacketDescription cannot be copied?音频队列服务回调:AudioStreamPacketDescription 无法复制?
【发布时间】:2012-01-08 12:38:20
【问题描述】:

我正在创建一个简单的 iOS 应用程序,它使用循环缓冲区记录音频。这意味着它会持续录制音频,但仅将最后 15 个缓冲区保留在内存中。

我通过复制从AudioInputCallback 获得的所有数据来做到这一点:

void AudioInputCallback(
                    void *inUserData, 
                    AudioQueueRef inAQ, 
                    AudioQueueBufferRef inBuffer, 
                    const AudioTimeStamp *inStartTime, 
                    UInt32 inNumberPacketDescriptions, 
                    const AudioStreamPacketDescription *inPacketDescs) 

这很好用,当我停止录制后将所有缓冲区保存到文件时,我可以正确录制AIF 文件。因此,将数据复制到其他缓冲区可以正常工作。

但问题是,当我使用使用可变数据包的M4A 时,相同的例程不起作用。当我将AudioFileWritePackets 方法放在回调中时,它可以正常工作,但是当我之后在存储的缓冲数据上使用它时,它会失败。

事实证明,这是由const AudioStreamPacketDescription *inPacketDescs 的数据引起的,当我在回调函数本身(在那里记录)中将其更改为我的副本时,它立即失败。但是数据本身是相同的。

这是格式:

struct AudioStreamPacketDescription {
   SInt64  mStartOffset;
   UInt32  mVariableFramesInPacket;
   UInt32  mDataByteSize;
};
typedef struct AudioStreamPacketDescription AudioStreamPacketDescription;

我使用以下方法在我的代码中创建了一个副本:

item.inPacketDescs = (AudioStreamPacketDescription *)(malloc(sizeof(AudioStreamPacketDescription)));

    item.inPacketDescs->mDataByteSize = inPacketDescs->mDataByteSize;
    item.inPacketDescs->mStartOffset = inPacketDescs->mStartOffset;
    item.inPacketDescs->mVariableFramesInPacket = inPacketDescs->mVariableFramesInPacket;

但是,当使用 item.inPacketDescs 而不是 inPacketDescs 时,它会立即失败。而这三个字段的数据是相同的。 (我使用调试器进行了检查)。

我现在有点没办法了。我看到提供的变量是const,所以我担心这有一些有意义的目的,比如AudioFileWritePackets 要求它是相同的内存地址左右?那将是非常愚蠢的,但我真的不知道了。

关于造成这种情况的任何想法?关于如何以不同方式将其保存到循环缓冲区的想法?

【问题讨论】:

    标签: ios copy audioqueueservices


    【解决方案1】:

    原来inPacketDescsarrayAudioStreamPackedDescription。 因此,仅复制第一个值失败。

    解决办法:

    AudioStreamPacketDescription * test = (AudioStreamPacketDescription *)(malloc(inNumberPacketDescriptions * sizeof(AudioStreamPacketDescription)));
        memcpy(test, inPacketDescs, inNumberPacketDescriptions * sizeof(AudioStreamPacketDescription));
    

    【讨论】:

    • 这对你有什么作用,你仍然只是在这里更新 test[0] 值
    • 不是吗?我复制了inNumberPacketDescriptions 数量的AudioStreamPacketDescription 大小,这将超过其中的 1 个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多