我试图编写最小的代码块来缩小问题的范围。现在只有几行,并且不起作用,这很清楚地表明我对如何使用AudioFileReadPackets有基本的误解。我已经在线阅读了文档和其他示例,但显然我没有。你能给我解释一下吗?

这是该块应执行的操作:我以前打开了一个文件。我只想读取一个数据包-文件的第一个-然后打印它。但它在AudioFileReadPackets行上崩溃:

    AudioFileID mAudioFile2;
    AudioFileOpenURL (audioFileURL, 0x01, 0, &mAudioFile2);
    UInt32 *audioData2 = (UInt32 *)malloc(sizeof(UInt32) * 1);
    AudioFileReadPackets(mAudioFile2, false, NULL, NULL, 0, (UInt32*)1, audioData2);
    NSLog(@"first packet:%i",audioData2[0]);

(为清楚起见,我删除了所有错误处理。)

是AFRP生产线崩溃了。

(我知道第三个和第四个参数是有用的,在我的“真实”代码中,我使用了它们,但是不是必需的,对吗?因此在这种情况下使用NULL应该对吗?)那么,这是怎么回事?

任何指导将不胜感激。

谢谢。

最佳答案

我认为您的问题在于数据包数参数。您只是在创建一个指向0x00000001的指针。问题是它尝试使用此输出是实际读取了多少个数据包的输出。您的音频缓冲区可能也太小。根据文档,它应该是数据包的长度乘以数据包长度的上限。

试试这个:

AudioFileID mAudioFile2;
AudioFileOpenURL (audioFileURL, 0x01, 0, &mAudioFile2);
UInt32 packetCount = 1;
void *audioData2 = (void *)malloc(packetCount * maxPacketSize);
AudioFileReadPackets(mAudioFile2, false, NULL, NULL, 0, &packetCount, audioData2);
NSLog(@"first packet:%i",audioData2[0]);

不太确定如何获取maxPacketSize(从未与此配合使用)。

08-28 13:54