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


Кодирование с переменной скоростью передачи данных Quality-Based

В отличие от кодировки константной скорости скорости (CBR), где кодировщик стремится поддерживать определенную скорость передачи данных в кодировке в режиме переменной скорости (VBR), кодировщик стремится достичь наилучшего качества закодированного носителя. Основное различие между CBR и VBR — это размер используемого окна буфера. Потоки в кодировке VBR обычно имеют большие буферные окна по сравнению с потоками в кодировке CBR.

Качество закодированного содержимого определяется объемом данных, которые теряются при сжатии содержимого. Многие факторы влияют на потерю данных в процессе сжатия; но в целом более сложные исходные данные и чем выше коэффициент сжатия, тем больше подробностей теряется в процессе сжатия.

В режиме VBR на основе качества не задаётся битрейт или окно буфера, которые кодировщик должен соблюдать. Вместо этого вы указываете уровень качества для потока цифровых носителей вместо скорости битов. Кодировщик сжимает содержимое таким образом, чтобы все образцы были сопоставимыми по качеству; это гарантирует согласованность качества в течение длительности воспроизведения независимо от требований буфера результирующего потока.

Кодирование VBR в зависимости от качества обычно приводит к созданию больших сжатых потоков. Как правило, этот тип кодирования хорошо подходит для локального воспроизведения или подключения к сети с высокой пропускной способностью (или скачивания и воспроизведения). Например, можно написать приложение для копирования песен из CD в ФАЙЛЫ ASF на компьютере. Использование кодировки VBR на основе качества гарантирует, что все скопированные песни имеют одинаковое качество. В таких случаях согласованное качество обеспечит более эффективное взаимодействие с пользователем.

Недостатком кодировки VBR на основе качества является то, что на самом деле нет способа знать требования к размеру или пропускной способности кодированного носителя перед сеансом кодирования, так как кодировщик использует один проход кодирования. Это может сделать файлы с VBR-кодировкой, основанной на качестве, неподходящими в условиях, когда память или пропускная способность ограничены, например, для воспроизведения контента на портативных медиаплеерах или потоковой передачи через сеть с низкой пропускной способностью.

Настройка кодировщика для кодирования Quality-Based VBR

Конфигурация кодировщика устанавливается с помощью значений свойств. Эти свойства определены в wmcodecdsp.h. Свойства конфигурации должны быть заданы в кодировщике перед согласованием типа выходного носителя. Сведения о настройке свойств кодировщика см. в настройке кодировщика.

В следующем списке показаны свойства, которые необходимо задать для этого типа кодирования:

  • Укажите режим кодирования VBR, задав для свойства MFPKEY_VBRENABLED значение VARIANT_TRUE.
  • Задайте для MFPKEY_PASSESUSED значение 1, так как в этом режиме VBR используется один проход кодирования.
  • Задайте требуемый уровень качества (от 0 до 100), задав свойство MFPKEY_DESIRED_VBRQUALITY. VBR на основе качества не кодирует содержимое по предопределённым параметрам буфера. Этот уровень качества будет поддерживаться для всего потока независимо от требований к скорости битрейта.
  • Для видеопотоков задайте среднее значение скорости передачи ненулевого значения в атрибуте MF_MT_AVG_BITRATE для выходного типа носителя кодировщика. После завершения сеанса кодирования точность скорости кодирования обновляется.

В следующем примере кода показана реализация SetEncodingProperties. Эта функция задает свойства кодирования уровня потока для CBR и VBR.

//-------------------------------------------------------------------
//  SetEncodingProperties
//  Create a media source from a URL.
//
//  guidMT:  Major type of the stream, audio or video
//  pProps:  A pointer to the property store in which 
//           to set the required encoding properties.
//-------------------------------------------------------------------

HRESULT SetEncodingProperties (const GUID guidMT, IPropertyStore* pProps)
{
    if (!pProps)
    {
        return E_INVALIDARG;
    }

    if (EncodingMode == NONE)
    {
        return MF_E_NOT_INITIALIZED;
    }
   
    HRESULT hr = S_OK;

    PROPVARIANT var;

    switch (EncodingMode)
    {
        case CBR:
            // Set VBR to false.
            hr = InitPropVariantFromBoolean(FALSE, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Set the video buffer window.
            if (guidMT == MFMediaType_Video)
            {
                hr = InitPropVariantFromInt32(VIDEO_WINDOW_MSEC, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_VIDEOWINDOW, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            break;

        case VBR:
            //Set VBR to true.
            hr = InitPropVariantFromBoolean(TRUE, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Number of encoding passes is 1.

            hr = InitPropVariantFromInt32(1, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_PASSESUSED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Set the quality level.

            if (guidMT == MFMediaType_Audio)
            {
                hr = InitPropVariantFromUInt32(98, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_DESIRED_VBRQUALITY, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            else if (guidMT == MFMediaType_Video)
            {
                hr = InitPropVariantFromUInt32(95, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_VBRQUALITY, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            break;

        default:
            hr = E_UNEXPECTED;
            break;
    }    

done:
    PropVariantClear(&var);
    return hr;
}

Типы кодирования ASF