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

Воспроизведение аудио фильма в формате QuickTime через многоканальную акустическую систему

Q: Как мы можем указать определенную пару каналов (динамики) для использования для воспроизведения фильма аудио QuickTime через многоканальную акустическую систему?

A: Как мы можем указать определенную пару каналов (динамики) для использования для воспроизведения фильма аудио QuickTime через многоканальную акустическую систему?

Для данного аудиотрека фильма в формате QuickTime используйте QTSetTrackProperty функция вместе с kQTAudioPropertyID_ChannelLayout атрибут для описания расположения канала дорожки.

Расположение канала описывает роли воспроизведения для каналов в аудиозаписи. Например, в стереозаписи, канал 1 имеет роль “левой передней стороны”, и канал 2 имеет роль “правильной передней стороны”.

При использовании QTSetTrackProperty с kQTAudioPropertyID_ChannelLayout атрибут необходимо передать AudioChannelLayout структура как значение свойства. AudioChannelLayout используется для указания расположений канала аудиотрека.

Вот AudioChannelLayout структура:

typedef struct AudioChannelLayout {
    AudioChannelLayoutTag mChannelLayoutTag;
    UInt32 mChannelBitmap;
    UInt32 mNumberChannelDescriptions;
    AudioChannelDescription mChannelDescriptions[1];
} AudioChannelLayout;

“Значение” Тегов Расположения Канала, сохраненное в mChannelLayoutTag, имеет значение, какая схема расположения используется, или, если схема не доступна там, mChannelBitmap может содержать битовый массив, описывающий расположение. Битовый массив формируется с помощью “Битовые массивы Канала”.

Значение kAudioChannelLayoutTag_UseChannelDescriptions (== 0), указывает, что нет никакого стандартного описания для упорядочивания или использования каналов в файле, так, чтобы описания канала использовались вместо этого. В этом случае, число описаний канала (mNumberChannelDescriptions) должен равняться числу каналов, содержавшихся в файле. Описания канала следуют mNumberChannelDescriptions поле.

Значение kAudioChannelLayoutTag_UseChannelBitmap (== 0x10000), указывает, что блок Расположения Канала использует битовый массив (в mChannelBitmap поле) для описания, какие каналы присутствуют.

Значение, больше, чем 0x10000, указывает один из предопределенных тегов расположения такой как kAudioChannelLayoutTag_Mono, kAudioChannelLayoutTag_Stereo, и т.д. Каждый тег расположения канала имеет две части:

Например, тег kCAFChannelLayoutTag_Stereo определяется как ((101 <<16) | 2) и указывает стерео с двумя каналами, упорядоченный оставленным как первый канал, право как второе.

Каждый AudioChannelDescription содержит информацию, описывающую единственный канал:

typedef struct AudioChannelDescription {     AudioChannelLabel mChannelLabel;     UInt32 mChannelFlags;     Float32 mCoordinates[3]; } AudioChannelDescription;

AudioChannelDescription используется AudioChannelLayout описать позицию динамика.

mChannelLabel элемент данных содержит “значение” Меток Канала, идентификация тега, как канал должен использоваться (оставленный, право, центр и т.д.), в то время как mChannelFlags метки, какая система координат используется (декартов, сферический, и т.д.). Позиция динамика удерживается mCoordinates, согласно “Флагам Канала” и “Координатам Канала”.

Код в Перечислении 1 показывает, как использовать QTSetTrackProperty функция с kQTAudioPropertyID_ChannelLayout атрибут для указания расположения канала аудио фильма для воспроизведения к устройству. В этом примере мы принимаем фильм с единственным потоком стерео (два канала) аудио. Первый канал аудио установлен играть к LeftSurround, и второй канал аудио установлен играть к RightSurround.

Перечисление 1  , Устанавливающее расположение звукового канала с помощью, определило разметки.

#define fieldOffset(type, field) ((size_t) &((type *) 0)->field)

const int kNumChannelDescriptions = 2;

#include <Carbon/Carbon.h>
#include <QuickTime/QuickTime.h>
#include <AudioToolbox/AudioToolbox.h>
#include <assert>

// Set the channel layout of the movie audio for playback to the device. 
// We assume a movie with a single stereo stream (two channels) of audio. 
// The first channel of audio is set to play to LeftSurround, and the 
// second channel of audio is set to play to RightSurround.

void setAudioTrackChannelLayout(Track inTrack)
{
    UInt32 trackChannelLayoutSize;
    AudioChannelLayout* trackChannelLayout = NULL;

    // Allocate a layout of the required size.
    trackChannelLayoutSize = fieldOffset(AudioChannelLayout, 
        mChannelDescriptions[kNumChannelDescriptions]);
    // Allocate buffer to hold the layout, initialize all bits to 0.
    trackChannelLayout = (AudioChannelLayout*)calloc(1, trackChannelLayoutSize);
    assert(trackChannelLayout != nil);

    // A tag that indicates the type of layout used.
    // Our channel layout is described using audio channel descriptions -- see 
    // AudioChannelLayout.mChannelDescriptions below.
    trackChannelLayout->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions ;

    // A bitmap that describes which channels are present.
    // We are not using channel bitmaps to describe our layout, we are using
    // the array of AudioChannelDescriptions to define the mapping.
    trackChannelLayout->mChannelBitmap = 0;

    // The number of channel descriptions in the mChannelDescriptionsarray. 
    // We are using 2 channel descriptions -- one description for Left Surround, 
    // the other for Right Surround.
    trackChannelLayout->mNumberChannelDescriptions = kNumChannelDescriptions ;

    // A label that describes the role of the channel. In common cases, such as 
    // “Left” or “Right,” role implies location. In such cases, mChannelFlags 
    // and mCoordinates can be set to 0.
    // In this example, we set the first channel to play to Left Surround, and
    // the second channel to play to Right Surround.
    trackChannelLayout->mChannelDescriptions[0].mChannelLabel = 
        kAudioChannelLabel_LeftSurround ;
    trackChannelLayout->mChannelDescriptions[1].mChannelLabel = 
        kAudioChannelLabel_RightSurround ;

    // Flags that indicate how to interpret the data in the mCoordinates field. 
    // If the audio channel does not require this information, set this field to 0.
    trackChannelLayout->mChannelDescriptions[0].mChannelFlags = kAudioChannelFlags_AllOff ; 
    trackChannelLayout->mChannelDescriptions[1].mChannelFlags = kAudioChannelFlags_AllOff ;

    // A set of three coordinates that specify the placement of the sound source for the 
    // channel in three dimensions, according to the mChannelFlags information. 
    // If the audio channel does not require this information, set this field to 0.
    trackChannelLayout->mChannelDescriptions[0].mCoordinates[0] = 0;
    trackChannelLayout->mChannelDescriptions[0].mCoordinates[1] = 0;
    trackChannelLayout->mChannelDescriptions[0].mCoordinates[2] = 0;

    trackChannelLayout->mChannelDescriptions[1].mCoordinates[0] = 0;
    trackChannelLayout->mChannelDescriptions[1].mCoordinates[1] = 0;
    trackChannelLayout->mChannelDescriptions[1].mCoordinates[2] = 0;

    // Set the channel layout properties on the audio track
    OSErr err = QTSetTrackProperty(inTrack, 
                                   kQTPropertyClass_Audio,
                                   kQTAudioPropertyID_ChannelLayout, 
                                   trackChannelLayoutSize, 
                                   trackChannelLayout );
    assert(err == noErr);

    free((void *)trackChannelLayout);
}

Используя дискретные каналы

Другая опция для установки расположения канала состоит в том, чтобы использовать дискретные каналы, означая каналы без любого расположения, наложенного на них.

Дискретные каналы удаляют любой вид беспорядка путем устранения пространственных присвоений на динамиках, таким образом, вместо того, чтобы использовать одну из стандартных разметок Вы отмечаете свое содержание с дискретными разметками. Например, учитывая источник аудиосигналов с 2 каналами можно присвоить первый канал для теряния значение первому динамику и второму каналу для теряния значение второму динамику.

Код в Перечислении 2 демонстрирует использование дискретных каналов. В этом примере первый поток стерео (сначала 2 канала) отмечен как дискретный 0, дискретный 1, так, чтобы это играло первым двум динамикам, и второй поток стерео отмечен дискретные 2, дискретные 3, для игры третьим и четвертым динамикам.

  Дискретные каналы Использования перечисления 2 для установки расположения канала.

#define fieldOffset(type, field) ((size_t) &((type *) 0)->field)

const int kNumChannelDescr = 4;

#include <Carbon/Carbon.h>
#include <QuickTime/QuickTime.h>
#include <AudioToolbox/AudioToolbox.h>
#include <assert>

// Set the channel layout of the movie audio for playback to the device. 
// We assume a movie with 2 stereo streams (four channels) of audio. 
// The first stereo stream is set to play out the first two speakers, and
// the second stereo stream is set to play out the third and fourth speakers.

void setAudioTrackChannelLayoutDiscrete(Track inTrack)
{
    UInt32 trackChannelLayoutSize;
    AudioChannelLayout* trackChannelLayout = NULL;

    // Allocate a layout of the required size
    trackChannelLayoutSize = fieldOffset(AudioChannelLayout, 
        mChannelDescriptions[kNumChannelDescr]);
    // Allocate buffer to hold the layout, initialize all bits to 0
    trackChannelLayout = (AudioChannelLayout*)calloc(1, trackChannelLayoutSize);
    assert(trackChannelLayout != nil);

    // A tag that indicates the type of layout used.
    // Our channel layout is described using audio channel descriptions -- see 
    // AudioChannelLayout.mChannelDescriptions below.
    trackChannelLayout->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions;

    // A bitmap that describes which channels are present.
    // We are not using channel bitmaps to describe our layout, we are using
    // the array of AudioChannelDescriptions to define the mapping.
    trackChannelLayout->mChannelBitmap =  0 ;

    // The number of channel descriptions in the mChannelDescriptionsarray. 
    // We are using 4 channel descriptions, one each for: Discrete 0, Discrete 1, 
    // Discrete 2 and Discrete 3.
    trackChannelLayout->mNumberChannelDescriptions = kNumChannelDescr ;

    // mChannelLabel = A label that describes the role of the channel. In common cases, 
    // such as “Left” or “Right,” role implies location. In such cases, mChannelFlags 
    // and mCoordinates can be set to 0.
    //
    // This example sets the following channel roles:
    //
    // first channel -> play to the first speaker
    trackChannelLayout->mChannelDescriptions[0].mChannelLabel = kAudioChannelLabel_Discrete_0;
    // second channel -> play to the second speaker
    trackChannelLayout->mChannelDescriptions[1].mChannelLabel = kAudioChannelLabel_Discrete_1; 
    // third channel -> play to the third speaker
    trackChannelLayout->mChannelDescriptions[2].mChannelLabel = kAudioChannelLabel_Discrete_2;
    // fourth channel -> play to the fourth speaker
    trackChannelLayout->mChannelDescriptions[3].mChannelLabel = kAudioChannelLabel_Discrete_3; 

    // Flags that indicate how to interpret the data in the mCoordinates field. 
    // If the audio channel does not require this information, set this field to 0.
    trackChannelLayout->mChannelDescriptions[0].mChannelFlags = 
        trackChannelLayout->mChannelDescriptions[1].mChannelFlags = 
            trackChannelLayout->mChannelDescriptions[2].mChannelFlags = 
                trackChannelLayout->mChannelDescriptions[3].mChannelFlags = 
                                                               kAudioChannelFlags_AllOff ;

    // Set the channel layout properties on the track
    OSErr err = QTSetTrackProperty(inTrack,
                                kQTPropertyClass_Audio,
                                kQTAudioPropertyID_ChannelLayout, 
                                trackChannelLayoutSize,
                                trackChannelLayout );
    assert(err == noErr);

    free((void *)trackChannelLayout);
}

Мои присвоения динамика не работают

Если Вы выполнили вышеупомянутые шаги, но Ваш канал и присвоения динамика все еще не работают правильно, необходимо проверить фактические присвоения динамика на компьютере. Например, если у Вас есть 5,1 системных проверок динамика, чтобы видеть, что Ваше аудиоустройство устанавливается таким образом, что присвоения динамика действительно L, R, C, LFE, Ls, RS.

Для конфигурирования аудиовхода и устройств вывода на Macintosh используйте Аудио Приложение установки Midi (см./Applications/Utilities/Audio Установку MIDI).

Для конфигурирования аудиовхода и устройств вывода на Windows используйте Панель управления Звуков и Аудиоустройств.

Ссылки

Ссылка типов данных Core Audio

Пример кода QTAudioExtractionPanel



История версии документа


ДатаПримечания
05.11.2008

Новый документ, которые указывают определенную пару каналов для воспроизведения фильма аудио QuickTime через многоканальную акустическую систему