Аудио-очередь - игра аудиофайла, содержащего HE-AAC закодированное аудио
Q: Я пытаюсь играть, HE-AACv1 закодировал аудиофайл, но kAudioFilePropertyDataFormat сообщает формат как плоскость 'aac'. Как делают я получаю надлежащее AudioStreamBasicDescription сконфигурировать Аудио-очередь правильно?
A: Я пытаюсь играть, HE-AACv1 закодировал аудиофайл, но kAudioFilePropertyDataFormat сообщает формат как плоскость 'aac'. Как делают я получаю надлежащее AudioStreamBasicDescription сконфигурировать Аудио-очередь правильно?
HE-AAC является многоуровневым форматом и имеет в его ядре базовый слой AAC. Закодированные данные для многоуровневого формата аудио могут быть сделаны из нескольких уровней, которые могли иметь различные частоты дискретизации, различные разметки канала и могут декодироваться к многократным целевым форматам. Любой декодер AAC был бы в состоянии декодировать базовый слой AAC потока битов HE-AAC.
kAudioFilePropertyFormatList Свойство
Core Audio представляет это разделение на уровни через понятие списка формата аудио, содержащего один или несколько элементов списка формата аудио, каждый элемент, представляющий доступный формат закодированных данных в файле.
Например, гипотетический файл, закодированный как HE-AACv1, может возвратить список формата аудио, содержащий два элемента списка формата аудио, описав доступные форматы как:
HE-AAC, 44.1 кГц, 2 канала (улучшенный уровень): Идентификатор формата 'aach'
AAC, 22.05 кГц, 2 канала (базовый слой): Идентификатор формата 'aac'
Другими словами, закодированные данные в файле могут быть представлены или как HE-AAC или как AAC-LC.
Список формата аудио для аудиофайла получен путем вызова AudioFileGetProperty использование kAudioFilePropertyFormatList свойство.
kAudioFilePropertyFormatList свойство возвратит массив AudioFormatListItem структуры (объявленный в AudioToolbox/AudioFormat.h), один для каждого альтернативного формата, представленного как a AudioStreamBasicDescription, AudioChannelLayoutTag пара.
/*!
@struct AudioFormatListItem
@abstract this struct is used as output from the kAudioFormatProperty_FormatList property
@field mASBD
an AudioStreamBasicDescription
@field mChannelLayoutTag
an AudioChannelLayoutTag
*/
struct AudioFormatListItem
{
AudioStreamBasicDescription mASBD;
AudioChannelLayoutTag mChannelLayoutTag;
};
typedef struct AudioFormatListItem AudioFormatListItem; |
Вы могли тогда выбрать надлежащее AudioStreamBasicDescription использовать с AudioQueueNewOutput когда создание новой Аудио-очереди возражает для воспроизведения.
kAudioFormatProperty_FirstPlayableFormatFromList Свойство
Так как возможности платформы могут варьироваться (HE-AAC, декодирующий, может быть доступным на одной платформе, но не на другом), Core Audio также имеет понятие первого играемого формата. Первый играемый формат является высшим качеством (или лучше всего) форматируют платформу, способно к воспроизведению, как определено во время выполнения.
Используйте AudioFormatGetProperty API с kAudioFormatProperty_FirstPlayableFormatFromList свойство для получения индексного значения для AudioFormatListItem в массиве списка формата аудио, описывающем формат высшего качества, устройство способно к воспроизведению.
Вот тот же список формата аудио до с индексными добавленными значениями.
Индекс 0 - HE-AAC, 44.1 кГц, 2 канала (улучшенный уровень): Идентификатор формата 'aach'
Индекс 1 - AAC, 22.05 кГц, 2 канала (базовый слой): Идентификатор формата 'aac'
Пример
Перечисление 1 демонстрирует как kAudioFilePropertyFormatList и kAudioFormatProperty_FirstPlayableFormatFromList свойства могут использоваться вместе для простого получения самого богатого (или лучше всего) поддерживаемое описание формата аудио для воспроизведения.
Перечисление 1
#include "CAStreamBasicDescription.h"
AudioFormatListItem GetFirstPlayableAudioFormatForFile(AudioFileID inFileID)
{
AudioFormatListItem *formatListPtr = NULL;
AudioFormatListItem formatItem = {0};
UInt32 propertySize;
OSStatus status = noErr;
if (NULL == inFileID) return formatItem;
status = AudioFileGetPropertyInfo(inFileID, kAudioFilePropertyFormatList, &propertySize, NULL);
if (noErr == status) {
// allocate memory for the format list items
formatListPtr = (AudioFormatListItem *)malloc(propertySize);
if (NULL == formatListPtr) return formatItem;
// get the list of Audio Format List Item's
status = AudioFileGetProperty(inFileID, kAudioFilePropertyFormatList, &propertySize, formatListPtr);
if (noErr == status) {
// print out some helpful information
UInt32 numFormats = propertySize / sizeof(AudioFormatListItem);
printf ("This file has a %d layered data format:\n", numFormats);
for (unsigned int i = 0; i < numFormats; ++i) {
CAStreamBasicDescription(formatListPtr[i].mASBD).Print();
}
UInt32 itemIndex;
UInt32 indexSize = sizeof(itemIndex);
// get the index number of the first playable format -- this index number will be for
// the highest quality layer the platform is capable of playing
status = AudioFormatGetProperty(kAudioFormatProperty_FirstPlayableFormatFromList, propertySize,
formatListPtr, &indexSize, &itemIndex);
if (noErr == status) {
printf ("Returning AudioFormatListItem at index %d.\n", itemIndex);
// copy the format item at index we want returned
formatItem = formatListPtr[itemIndex];
}
}
free(formatListPtr);
}
return formatItem;
} |
История версии документа
| Дата | Примечания |
|---|---|
| 21.04.2009 | Первая версия |
Новый документ, описывающий, как использовать свойство FormatList для, выбрал самый богатый доступный формат для воспроизведения AQ. |