2013-07-05 1 views
1

Я играю файл AAC (kAudioFormatMPEG4AAC), используя службы очереди аудио iOS. Он отлично работает, поэтому мой код работает.AudioDataPacketCount возвращает ValueUnknown

Теперь я ищу функцию поиска. Для этого мне нужно общее количество аудиопакетов. Когда моя собственность-слушатель-прок получает kAudioFileStreamProperty_ReadyToProducePackets я:

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

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

Вопрос заключается в том, что AudioFileStreamGetProperty() возвращает kAudioFileStreamError_ValueUnknown (1970170687 при печати в отладчике).

Я что-то не так?

ответ

2

Оказалось, что я вообще ничего не делал.

Я обнаружил, что API-интерфейсы iOS не предоставляют это, потому что этот формат файла может содержать фрагменты, каждый из которых имеет свой собственный счетчик пакетов. Следовательно, общее количество пакетов для файла не может быть известно после чтения первого заголовка.

Однако во многих аудиофайлах имеется только один фрагмент, поэтому немного грустно, что iOS не будет просто указывать количество пакетов, которое он знает в определенный момент (т. Е. После прочтения заголовка файла).

При работе с AudioFileStreamSeek() я думал следующее сжать информацию из прошивки:

- (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. 
}