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


Создание объекта мультиплексера

Мультиплексор ASF — это объект уровня WMContainer, который работает с объектом данных ASF и дает приложению возможность создавать пакеты данных ASF для потоков мультимедиа.

Объект мультиплексера предоставляет интерфейс IMFASFMultiplexer . Чтобы создать мультиплексор, вызовите MFCreateASFMultiplexer. Эта функция возвращает указатель на пустой объект. Если приложение записывает новый ASF-файл, приложение должно инициализировать мультиплексор с помощью объекта ContentInfo. Для этого вызовите IMFASFMultiplexer::Initialize. Указанный объект ContentInfo представляет объект заголовка ASF нового файла. Сведения о создании и инициализации объекта ContentInfo для нового файла см. в статье Инициализация объекта ContentInfo нового ФАЙЛА ASF.

Метод Initialize анализирует объект ContentInfo для сбора сведений о конфигурации потока, таких как количество потоков, размер пакета и предварительная подготовка. При необходимости мультиплексору также могут потребоваться параметры контейнера с утечкой и единицы расширения полезных данных. Эти сведения необходимы для создания пакетов данных, соответствующих требованиям, определенным в объекте заголовка ASF. Метод Initialize настраивает мультиплексор на основе типа носителя и параметров конфигурации потоков. Например, если в потоке настроены расширения полезных данных (см. раздел Создание и настройка потоков ASF), то мультиплексор настраивается для добавления этих значений в созданные пакеты данных.

Метод Initialize также получает дескриптор исходного объекта данных, который был создан во время создания объекта ContentInfo для записи. Во время создания пакетов данных мультиплексор добавляет пакеты в объект данных и обновляет его соответствующим образом. После того как мультиплексор создаст все пакеты данных, он обновляет предоставленный объект ContentInfo, чтобы обновить определенные значения, такие как количество пакетов данных.

В следующем примере кода показано, как создать мультиплексор и инициализировать его с помощью объекта ContentInfo.

//-------------------------------------------------------------------
// CreateOutputGenerators
//
// Creates the ASF mux and the ASF Content Info object for the 
// output file.
//-------------------------------------------------------------------

HRESULT CreateOutputGenerators(
    IMFASFProfile *pProfile, 
    IMFASFContentInfo **ppContentInfo, 
    IMFASFMultiplexer **ppMux
    )
{
    IMFASFContentInfo *pContentInfo = NULL;
    IMFASFMultiplexer *pMux = NULL;

    // Use the ASF profile to create the ContentInfo object.
    HRESULT hr = MFCreateASFContentInfo(&pContentInfo);

    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->SetProfile(pProfile);
    }

    // Create the ASF Multiplexer object.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateASFMultiplexer(&pMux);
    }
    
    // Initialize it using the new ContentInfo object.
    if (SUCCEEDED(hr))
    {
        hr = pMux->Initialize(pContentInfo);
    }

    // Return the pointers to the caller.
    if (SUCCEEDED(hr))
    {
        *ppContentInfo = pContentInfo;
        (*ppContentInfo)->AddRef();

        *ppMux = pMux;
        (*ppMux)->AddRef();
    }

    SafeRelease(&pContentInfo);
    SafeRelease(&pMux);

    return hr;
}

Сведения об этой функции, используемой в полном приложении, см. в статье Руководство. Копирование потоков ASF из одного файла в другой.

Параметры инициализации мультиплексоров и утечки контейнеров

Метод IMFASFMultiplexer::Initialize настраивает мультиплексор для определения потока данных в сегменте утечки. Чтобы настроить эти параметры, убедитесь, что для указанного объекта ContentInfo заданы следующие значения свойств. Сведения о настройке этих свойств см. в разделе Настройка свойств объекта ContentInfo.

  • свойство MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE . Указывает, нужно ли мультиплексору автоматически настраивать скорость передачи данных для поддержания потока данных в контейнере с утечкой. Приложение может изменить этот параметр, вызвав IMFASFMultiplexer::SetFlags и передав флаг MFASF_MULTIPLEXER_AUTOADJUST_BITRATE .

  • свойство MFPKEY_ASFMEDIASINK_BASE_SENDTIME . Время отправки указывает, когда будут освобождены полезные данные в контейнере с утечкой. Время отправки должно быть равно или раньше времени презентации, так как полезные данные должны иметь время, чтобы добраться до места назначения до начала презентации.

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

Мультиплексор получает сведения о конфигурации потока из профиля ASF, связанного с объектом ContentInfo, указанным в методе Initialize . Сведения о конфигурации потока включают параметры контейнера с утечкой. Это значение требуется мультиплексору для создания пакетов данных.

Чтобы указать параметры контейнера с утечкой, задайте значения в атрибуте MF_ASFSTREAMCONFIG_LEAKYBUCKET1 объекта конфигурации потока, представляющего поток в профиле. Чтобы использовать значение окна буфера, используемое кодировщиком, вызовите IWMCodecLeakyBucket::GetBufferSizeBits. Фактическое значение окна буфера известно только после задания типа выходного носителя кодировщика. Сведения о настройке типа выходного носителя см. в разделе Согласование типов мультимедиа в кодировщике.

Примечание

Значения утечки контейнеров, используемые кодировщиком, могут отличаться в объекте ContentInfo, предоставленном профилем ASF, который использовался для создания мультиплексера.

 

Метод Initialize обновляет объект ContentInfo таким образом, чтобы правильные значения отображались в окончательном объекте заголовка ASF.

Мультиплексор ASF

Создание новых пакетов данных ASF