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


Перечисление типов аудио для определенных режимов кодирования (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 с одним проходом на основе параметра quality. Кодировщик помещает значение качества для однопроходных выходных типов 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