gpt4 book ai didi

ios - 音频队列服务回调: AudioStreamPacketDescription cannot be copied?

转载 作者:行者123 更新时间:2023-12-02 18:07:37 24 4
gpt4 key购买 nike

我正在创建一个简单的 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 要求它是相同的内存地址等等?那将是非常愚蠢的,但我真的不知道了。

对于造成这种情况的原因有什么想法吗?关于如何将其以不同方式保存到循环缓冲区的想法?

最佳答案

事实证明,inPacketDescsAudioStreamPackedDescription数组。因此,仅复制第一个值失败。

解决方案:

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

关于ios - 音频队列服务回调: AudioStreamPacketDescription cannot be copied?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777566/

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