Настройка профилей и других свойств ASF-файлов
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
В следующих элементах описывается выполнение различных задач, связанных с созданием ASF-файлов. Некоторые интерфейсы, упомянутые в этом разделе, описаны в документации по пакету SDK для формата Windows Media.
Создание профиля
Профили ASF подробно рассматриваются в пакете SDK для формата Windows Media. По сути, они описывают атрибуты файла формата Windows Media, такие как скорость передачи данных, количество и тип потоков, а также качество сжатия. Фильтр использует профиль для определения типа файла формата Windows Media для записи, количества входных контактов и типов мультимедиа, которые они могут принимать.
Чтобы создать пользовательский профиль, используйте пакет SDK для формата Windows Media напрямую, чтобы создать объект диспетчера профилей с помощью функции WMCreateProfileManager . Затем создайте профиль и передайте его в модуль записи WM ASF с помощью метода IConfigASFWriter::ConfigureFilterUsingProfile . Это единственный способ настроить фильтр с помощью профиля, использующего кодеки Windows Media Audio and Video 9 Series. Системные профили для более ранних версий этих кодеков можно добавить с помощью метода IConfigASFWriter::ConfigureFilterUsingProfileGuid .
Вы можете сбросить профиль при подключении входных контактов фильтра, если новый профиль не требует дополнительных входных контактов. Например, если изменить профиль с одного входного аудио профиля на профиль с двумя входными аудио- и видеопрофилем, просто звуковой контакт будет повторно подключен, и новый контакт для видеопотока не будет создан.
Добавление метаданных
Чтобы добавить метаданные в файл, запросите фильтр модуля записи WM ASF для интерфейса IWMHeaderInfo . После получения фильтра профиля используйте методы интерфейса IWMHeaderInfo для записи метаданных.
Индексирование файла
Модуль записи WM ASF по умолчанию создает темпоральные индексированные файлы. Чтобы создать файл с индексированием фрейма, используйте метод IConfigAsfWriter::SetIndexMode , чтобы отключить все индексирование, а затем создайте файл. По завершении используйте пакет SDK для формата Windows Media напрямую, чтобы создать индекс на основе кадров для файла.
Кодировка Two-Pass
Двухпроходимая кодировка поддерживается только в кодеках 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 , чтобы сбросить фильтр перед попыткой другого выполнения предварительной обработки.
Чтобы полностью выйти из режима предварительной обработки, для параметра AM_CONFIGASFWRITER_PARAM_MULTIPASS необходимо задать значение FALSE .
Важно!
Приложение отвечает за включение режима предварительной обработки на основе профиля, который будет использоваться для кодирования. Для некоторых профилей требуется двухпроходимая кодировка; Если попытаться закодировать файл с таким профилем и не задать для AM_CONFIGASFWRITER_PARAM_MULTIPASS значение TRUE, произойдет ошибка EC_USERABORT . Дополнительные сведения см. в документации по пакету SDK для формата Windows Media.
Получение и настройка свойств буфера во время выполнения
В некоторых сценариях, например при принудительной вставке ключевых кадров при записи файла, приложению может потребоваться получить или задать сведения о буфере Windows Media во время выполнения. Фильтры читателя WM ASF и модуля записи WM ASF поддерживают механизм обратного вызова, который позволяет приложению получать доступ к интерфейсу INSSBuffer3 в каждом отдельном буфере мультимедиа во время чтения или записи файла. Приложения могут использовать этот интерфейс для обозначения конкретных примеров в качестве ключевых кадров, задания кодов времени SMPTE, указания параметров чередование или добавления любых типов частных данных в поток.
Используйте интерфейс IAMWMBufferPass для регистрации обратных вызовов от контакта, обрабатывающего видеопоток. Закрепление вызовет метод IAMWMBufferPassCallback::Notify для каждого буфера.
Некверные пиксели
Модуль записи 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 = S_OK; 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));
Связанные темы