ios - AudioDataPacketCount 返回 ValueUnknown

标签 ios audioqueueservices

我正在使用 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/

相关文章:

CoreAudio AudioQueue PCM 快速且不稳定

iOS:SKPaymentTransactionStateRestored originalTransaction == nil

ios - 如何跟踪 iOS 崩溃的确切问题

ios - 在 RxSwift 中观察其他 ViewController 中的对象变化

iphone - iPhone开发者-后台录音的AudioQueue Services

c - 音频队列服务缓冲区是否需要是数据包大小的偶数倍?

iphone - AVAssestReader 停止音频回调

c# - iOS - 从 Xcode 发布 iOS 应用程序时出错

iOS 在两种颜色之间的点查找颜色