Поделиться через


Перечисление типов аудио для определенных режимов кодирования (Microsoft Media Foundation)

Входные и выходные типы носителей, принятые кодировщиком звука, очень структурированы. Необходимо получить поддерживаемые типы выходных данных путем вызова метода IMediaObject::GetOutputType или IMFTransform::GetOutputType. После получения выходного типа не следует изменять его.

Если вы хотите использовать режим кодирования, отличный от одного прохода CBR, необходимо задать режим, а затем перечислить типы выходных данных для этого режима; Кодировщик изменяет поддерживаемые типы выходных данных в зависимости от набора режима. Свойства, управляющие режимом кодирования, MFPKEY_VBRENABLED и MFPKEY_PASSESUSED. Если режим задан в кодировщике, необходимо перечислить и выбрать тип вывода, используя его без изменения, как и в CBR.

Определение типов VBR на основе качества

Процедура определения типов VBR на основе качества зависит от того, работает ли кодировщик как объект мультимедиа DirectX (DMO) или как преобразование Media Foundation (MFT). Сведения о том, когда кодировщик действует как DMO или MFT, см. на отдельных справочных страницах кодека в разделе Объекты кодека.

Если звуковой кодировщик выступает в качестве DMO, и вы настраиваете кодировщик для использования однопроходной VBR, он перечисляет все поддерживаемые типы выходных данных. Однако обычно требуется выбрать тип VBR с одним проходом на основе параметра качества. Кодировщик помещает значение качества для типов выходных данных VBR одного прохода в элемент nAvgBytesPerSec структуры WAVEFORMATEX, на которую указывает DMO_MEDIA_TYPE.pbFormat.

Это значение хранится в следующем формате: 0x7FFFFFXX, где XX — это значение качества (от 0 до 100). Например, значение nAvgBytesPerSec 0x7FFFFF62 указывает уровень качества 98 (0x62 = 98).

В следующем примере показано, как проверить уровень качества формата, когда кодировщик выступает в качестве DMO.

void ShowQuality(WAVEFORMATEX* pWave)
{
    // Store the average bytes per second in a local variable
    // with a more manageable name.
    DWORD dwBps = pWave->nAvgBytesPerSec;

    // Verify that the value is a VBR quality level by using 
    // a bitmask to check for the bit pattern 0x7FFFFFXX. 
    if(dwBps & 0x7FFFFF00 == 0x7FFFFF00)
        printf("VBR Quality: %d%%\n",(dwBps & 0x000000FF));
    else // Not a valid VBR quality value.
        printf("Not a valid one-pass VBR audio format.\n");
}

Когда кодировщик выступает в качестве MFT и перечисляет тип вывода при вызове функции GetAvailableOutputType, можно запросить у MFT свойство MFPKEY_MOST_RECENTLY_ENUMERATED_VBRQUALITY. Возвращаемое значение указывает качество VBR последнего возвращаемого выходного типа носителя. Затем можно использовать это значение для задания свойства MFPKEY_DESIRED_VBRQUALITY кодировщика.

Настройка пиковых ограничений

Для VBR на основе качества (один проход) и неограниченного двухпроходного VBR дополнительные параметры не требуются после получения выходного типа. Чтобы использовать пиковые ограничения VBR, извлеките тип вывода с включенным параметром VBR и двумя проходами. Этот тип, без изменения, описывает не ограниченные параметры VBR. Чтобы задать пиковые ограничения, задайте свойства MFPKEY_RMAX и MFPKEY_BMAX.

настройка кодировки звука

поиск типов выходных данных аудиокодировщика

Использование кодировки Two-Pass

Использование кодирования VBR