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


Кодирование переменной скорости Quality-Based

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

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

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

Кодирование VBR на основе качества, как правило, создает большие сжатые потоки. Как правило, этот тип кодирования хорошо подходит для локального воспроизведения или сетевых подключений с высокой пропускной способностью (а также для скачивания и воспроизведения). Например, можно написать приложение для копирования песен с компакт-диска в 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