我正在使用 iOS 的音频队列服务播放 AAC (kAudioFormatMPEG4AAC
) 文件。它播放得很好,所以我的代码有效。
现在我正在研究搜索功能。为此,我需要音频数据包的总数。当我的 property-listener-proc 接收到 kAudioFileStreamProperty_ReadyToProducePackets
时,我会:
UInt64 totalPackets;
UInt32 size = sizeof(totalPackets);
OSStatus status;
status = AudioFileStreamGetProperty(inAudioFileStream,
kAudioFileStreamProperty_AudioDataPacketCount,
&packetCountSize,
&myData->totalPackets);
问题是 AudioFileStreamGetProperty()
返回 kAudioFileStreamError_ValueUnknown
(在调试器中打印时为 1970170687
)。
我做错了什么吗?
最佳答案
事实证明我根本没有做错什么。
我发现 iOS API 不提供此功能,因为此文件格式可能包含片段,每个片段都有自己的数据包计数。因此,在读取第一个 header 后无法知道文件的总包数。
然而,在许多音频文件中只有一个片段,所以有点遗憾的是 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.
}
关于ios - AudioDataPacketCount 返回 ValueUnknown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17492863/