Технические вопросы и ответы QA1639

Аудио-очередь - игра аудиофайла, содержащего 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 или как 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 в массиве списка формата аудио, описывающем формат высшего качества, устройство способно к воспроизведению.

Вот тот же список формата аудио до с индексными добавленными значениями.

Пример

Перечисление 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.