AudioDataPacketCount返回ValueUnknown

我正在使用iOS的“audio队列服务”播放AAC( kAudioFormatMPEG4AAC )文件。 它玩的很好,所以我的代码工作。

现在我正在寻求function。 为此,我需要audio数据包的总数。 当我的属性监听器proc收到kAudioFileStreamProperty_ReadyToProducePackets我做:

 UInt64 totalPackets; UInt32 size = sizeof(totalPackets); OSStatus status; status = AudioFileStreamGetProperty(inAudioFileStream, kAudioFileStreamProperty_AudioDataPacketCount, &packetCountSize, &myData->totalPackets); 

问题是AudioFileStreamGetProperty()在debugging器中打印时返回kAudioFileStreamError_ValueUnknown1970170687 )。

难道我做错了什么?

原来我没有做错什么。

我发现iOS API不提供这个,因为这个文件格式可能包含片段,每个都有自己的数据包数量。 因此,在读取第一个报头之后,不能知道文件的总包数。

但是,在许多audio文件中只有一个片段,所以有些不幸的是,iOS不会在某个时间点(即在读取文件头之后)提供它所知道的包计数。

当使用AudioFileStreamSeek()我想到了以下内容来挤出iOS的信息:

 - (SInt64)getTotalPacketCount { OSStatus status; UInt32 ioFlags = 0; long long byteOffset = 0; SInt64 lower = 0; SInt64 upper = 1000000; // Large enough to fit any packet count. SInt64 current; // Current packet count. // Binary search to highest packet count that has successful seek. while (upper - lower > 1 || status != 0) { current = (upper + lower) / 2; status = AudioFileStreamSeek(audioFileStream, current, &byteOffset, &ioFlags); if (status == 0) { lower = current; } else { upper = current; } } return current + 1; // Go from packet number to count. }