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


Настройка профилей и других свойств файла (QASF)

В следующих элементах описывается выполнение различных задач, связанных с созданием ASF-файлов.

Создание профиля (QASF)

Чтобы создать пользовательский профиль, используйте пакет SDK для формата Windows Media напрямую, чтобы создать объект диспетчера профилей с помощью функции WMCreateProfileManager . Затем создайте профиль и передайте его в модуль записи WM ASF с помощью метода IConfigASFWriter::ConfigureFilterUsingProfile . Это единственный способ настроить фильтр с помощью профиля, использующего кодеки Windows Media Audio and Video 9 Series. Системные профили для более ранних версий этих кодеков можно добавить с помощью метода IConfigASFWriter::ConfigureFilterUsingProfileGuid .

Добавление метаданных (QASF)

Чтобы добавить метаданные в файл, вызовите QueryInterface из интерфейса IBaseFilter в средстве записи WM ASF , чтобы получить интерфейс IWMHeaderInfo . После получения фильтра профиля используйте методы интерфейса IWMHeaderInfo для записи метаданных.

Индексирование файла (QASF)

Модуль записи WM ASF по умолчанию создает темпоральные индексированные файлы. Чтобы создать файл с индексированием фрейма, используйте метод IConfigAsfWriter::SetIndexMode , чтобы отключить все индексирование, а затем создайте файл. По завершении используйте пакет SDK для формата Windows Media напрямую, чтобы создать индекс на основе кадров для файла.

Выполнение Two-Pass кодирования (QASF)

Двухпроходимая кодировка поддерживается только в кодеках Windows Media версии 8 и более поздних. Переведите модуль записи WM ASF в режим предварительной обработки, вызвав метод IConfigAsfWriter2::SetParam и указав AM_CONFIGASFWRITER_PARAM_MULTIPASS в параметре dwParam и TRUE в параметре dwParam1 .

Затем запустите граф фильтра. После завершения всех проходов предварительной обработки (обычно выполняется только один проход предварительной обработки), приложение получит событие EC_PREPROCESS_COMPLETE из фильтра. При получении этого события используйте IMediaSeeking::SetPositions , чтобы сбросить указатель потока обратно в начало и снова запустить граф фильтра. После последнего прохода (как правило, второго прохода) приложение получит событие EC_COMPLETE , означающее, что процесс кодирования завершен. Если проход предварительной обработки отменяется до получения события EC_PREPROCESS_COMPLETE , вызовите метод IConfigAsfWriter2::ResetMultiPassState , чтобы сбросить фильтр перед попыткой другого выполнения предварительной обработки.

Вызывать IConfigAsfWriter::SetParam(AM_CONFIGASFWRITER_PARAM_MULTIPASS, FALSE) необходимо только в том случае, если требуется полностью вывести фильтр из режима предварительной обработки.

Важно!

Приложение отвечает за включение режима предварительной обработки на основе профиля, который будет использоваться для кодирования. Для некоторых профилей требуется двухпроходимая кодировка; Если попытаться закодировать файл с таким профилем и не задать для AM_CONFIGASFWRITER_PARAM_MULTIPASS значение TRUE, произойдет ошибка EC_USERABORT. Дополнительные сведения о том, как определить, требуется ли для определенного профиля двухпрохватное кодирование, см. в разделе Использование кодировки Two-Pass или запись потоков с переменной скоростью.

 

Получение и настройка свойств буфера во время выполнения (QASF)

В некоторых сценариях, например при принудительной вставке ключевых кадров при записи файла, приложению может потребоваться получить или задать сведения о буфере Windows Media во время выполнения. Фильтры читателя WM ASF и модуля записи WM ASF поддерживают механизм обратного вызова, который позволяет приложению получать доступ к интерфейсу INSSBuffer3 в каждом отдельном буфере мультимедиа во время чтения или записи файла. Приложения могут использовать этот интерфейс для обозначения конкретных примеров в качестве ключевых кадров или точек очистки, для задания кодов времени SMPTE, указания параметров чередовки или добавления любых типов частных данных в поток.

Используйте интерфейс IAMWMBufferPass для регистрации обратных вызовов от контакта, обрабатывающего видеопоток. Когда закрепление вызывает метод IAMWMBufferPassCallback::Notify , проверьте метки времени в буфере и при необходимости вызовите метод INSSBuffer3::SetProperty , чтобы задать для свойства WM_SampleExtensionGUID_OutputCleanPoint в буфере значение TRUE.

Поддержка некверных пикселей (QASF)

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

Когда средство чтения WM ASF обнаруживает сведения о пропорциях пикселей в заголовке файла или в расширениях единиц данных для примеров, он будет предлагать тип мультимедиа VIDEOINFOHEADER2 в качестве первого выбора на выходе. Элементы dwPictAspectRatioX и dwPictAspectRatioY структуры, описывающие пропорции прямоугольника видео, будут правильно скорректированы с учетом пропорций пикселей.

Сохранение чередующегося формата

Если вы захватываете чередующееся видео с телевизора или dv-камеры, вы можете сохранить исходное видео в качестве независимых полей, если ожидается, что закодированный файл будет воспроизводиться на телевизоре или другом устройстве с чередованием дисплея. (Компьютерные мониторы — это устройства прогрессивного сканирования.) Если вы деинтерлейсируете видео, а затем повторно переинтернтерлейсируете его для воспроизведения на телевизоре, произойдет некоторая потеря данных. В ASF-файле сведения о переплетении хранятся в виде расширений единиц данных, которые приложение применяет к каждому образцу с помощью метода IAMWMBufferPassCallback , описанного выше. Чтобы закодировать файл, сохраняющий исходные параметры чередование, выполните следующие действия.

  • Реализуйте класс, поддерживающий IAMWMBufferPassCallback , и напишите функцию Notify, которая устанавливает флаги чередующихся элементов для каждого примера. Эта функция будет вызываться модулем WM ASF, прежде чем обрабатывать каждый образец.
// Set to WM_CT_TOP_FIELD_FIRST if that is your format.
BYTE flag = WM_CT_INTERLACED | WM_CT_BOTTOM_FIELD_FIRST;
            HRESULT hr = pNSSBuffer3->SetProperty(WM_SampleExtensionGUID_ContentType, (void*) &flag, WM_SampleExtension_ContentType_Size);
           
  • Задайте расширения единиц данных в профиле перед передачей профиля в фильтр.
hr = pWMStreamConfig2->AddDataUnitExtension( WM_SampleExtensionGUID_ContentType, WM_SampleExtension_ContentType_Size, NULL, 0 );
  • После настройки фильтра с помощью профиля получите интерфейс IWMWriterAdvanced2 из модуля записи WM ASF и вызовите метод SetInputSettings .

// Must do this first.

hr = pConfigAsfWriter2->ConfigureFilterUsingProfile(pProfile);

  
CComPtr<IServiceProvider> pProvider;
  CComPtr<IWMWriterAdvanced2> pWMWA2;
  hr = pConfigAsfWriter2->QueryInterface( __uuidof(IServiceProvider),
                                         (void**)&pProvider);
  if (SUCCEEDED(hr))
  {
      hr = pProvider->QueryService(IID_IWMWriterAdvanced2,
                    IID_IWMWriterAdvanced2,
                    (void**)&pWMWA2);
  }
  BOOL pValue = TRUE;
 // Set the first parameter to your actual input number.
 hr = pWMWA2->SetInputSetting(0, g_wszInterlacedCoding,
              WMT_TYPE_BOOL, (BYTE*) &pValue, sizeof(WMT_TYPE_BOOL));