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


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

  1. Реализуйте класс, поддерживающий 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
        );         
    
  2. Задайте расширения единиц данных в профиле перед передачей профиля в фильтр.

    hr = pWMStreamConfig2->AddDataUnitExtension(
        WM_SampleExtensionGUID_ContentType, 
        WM_SampleExtension_ContentType_Size, 
        NULL, 
        0 
        );
    
  3. После настройки фильтра с помощью профиля получите интерфейс 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));
    
    

Создание ASF-файлов в DirectShow