Термин «пакет» относится к группе сжатых аудиозаписей с заголовком. Вам нужен заголовок для декодирования данных, следующих за ним. Если вы считаете, что ваш файл ima4 является книгой, каждый пакет является страницей. В верхней части находятся значения, необходимые для декодирования этой страницы, а затем сжатый звук.
Вот почему вам нужно рассчитать размер распакованных данных (а затем создать пространство для него) - поскольку он сжат, вам необходимо преобразовать данные из сжатого аудио в несжатый звук, прежде чем вы сможете его вывести. Чтобы выделить выходной буфер, вам нужно знать, насколько он должен быть (обратите внимание: вам может потребоваться вывод в виде кусков, размер которых превышает один пакет за раз).
Похоже, что типичная структура в предыдущем разделе «Обзор» состоит в том, что наборы из 64 отсчетов, каждый из 16 бит (так 128 байт) переводится в 2-байтовый заголовок и 32-байтовый набор сжатых образцы (всего 34 байта). Таким образом, в типичном случае вы можете создать ожидаемый выходной массив данных, взяв размер входных данных, разделив его на 34, чтобы получить количество пакетов, а затем умножить на 128 байт для несжатого звука в пакете.
Вы не должны этого делать. Похоже, вы должны вместо этого запросить kAudioFilePropertyDataFormat, чтобы получить mBytesPerPacket - это значение «34» выше, а mFramesPerPacket - это выше 64, который умножается на 2 (для 16-байтовых выборок), чтобы сделать 128 байтов вывода.
Затем для каждого пакета вам необходимо выполнить декодирование, описанное в сообщении. В несколько более псевдо C-код, при условии, что вы получаете массивы байтов, для обработки заголовка:
packet = GetPacket();
Header = (packet[0] << 8) | packet[1]; //Big-endian 16-bit value
step_index = Header & 0x007f; //Lower seven bits
predictor = Header & 0xff80; //Upper nine bits
for (i = 2; i < mBytesPerPacket; i++)
{
nibble = packet[i] & 0x0f; //Low Nibble
process that nibble, per the blogpost -- be careful on sign-extension!
nibble = (packet[i] & 0xf0) >> 4; //High Nibble
process that nibble, per the blogpost -- be careful on sign-extension!
}
Знак-расширение выше, относится к тому, что пост включает в себя обработку каждого грызть как в беззнаковое и подписанный способ. Если высокий бит полубайта (бит 3) равен 1, то он отрицательный; кроме того, бит-сдвиг может выполнять расширение знака. Это не обрабатывается в вышеуказанном псевдокоде.
сказать также людей на то, что вы застряли. Какие шаги вы завершили, и где вы столкнулись с вашими проблемами? – Younes
Вам нужно использовать OpenAL? Вам нужно сделать только декодирование, если вы используете OpenAL, иначе вы можете просто обработать CoreAudio. –