1

我正在kAudioFormatMPEG4AAC使用 iOS 的音频队列服务播放 AAC ( ) 文件。它运行良好,所以我的代码有效。

现在我正在研究寻找功能。为此,我需要音频包的总数。当我的 property-listener-proc 收到kAudioFileStreamProperty_ReadyToProducePackets我做的:

UInt64   totalPackets;
UInt32   size = sizeof(totalPackets);
OSStatus status;

status = AudioFileStreamGetProperty(inAudioFileStream,
                                    kAudioFileStreamProperty_AudioDataPacketCount,
                                    &packetCountSize,
                                    &myData->totalPackets);

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

难道我做错了什么?

4

1 回答 1

3

事实证明,我根本没有做错什么。

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

然而,在许多音频文件中只有一个片段,所以 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.
}
于 2013-09-09T07:44:53.263 回答