我尝试编写最小的代码块来缩小问题范围。它现在只是几行而且它不起作用,这很清楚我对如何使用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应该可以工作,对吧?)那么什么是继续?
非常感谢任何指导。
感谢。
答案 0 :(得分:4)
我认为你的问题是数据包参数。您只是创建一个指向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(从未使用过这个)。