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


Добавление сведений о потоке в приемник файлов ASF

Приемник файлов ASF — это реализация IMFMediaSink , предоставляемая Media Foundation, которую приложение может использовать для архивации данных мультимедиа ASF в файл. Сведения об объектной модели приемников мультимедиа ASF и общем использовании см. в разделе Приемники мультимедиа ASF.

После создания экземпляра приемника файлов его необходимо настроить перед созданием топологии. Приемник файлов должен знать о потоках в выходном файле, сведения о режиме кодирования и метаданных. В этом разделе описывается процесс добавления потока в приемник файлов.

Добавление потоков в приемник файлов ASF

Приемник файлов должен знать о выходных потоках и их свойствах, чтобы он смог соответствующим образом создавать выходные примеры и добавлять их в выходной ASF-файл. Эти параметры записываются в окончательный объект заголовка ASF.

Чтобы задать сведения о потоке, необходимо иметь ссылку на объект ASF ContentInfo приемника файла. Дополнительные сведения см. в разделе Создание приемника файлов ASF.

В следующей процедуре приведены общие шаги по настройке потока с помощью объекта профиля ASF.

Настройка сведений о потоке в приемнике файлов ASF

  1. Создайте объект профиля ASF, вызвав MFCreateASFProfile.

  2. Для каждого потока в выходном файле создайте тип мультимедиа для целевого потока, который будет добавлен в приемник файлов. Тип носителя должен быть совместим с типами выходных данных, поддерживаемыми кодировщиками Windows Media.

    Сведения о добавлении аудиопотоков в профиль см. в разделе Создание аудиопотоков для кодирования ASF.

    Сведения о добавлении видеопотоков в профиль см. в разделе Создание видеопотоков для кодирования ASF.

  3. Создайте потоки на основе типов мультимедиа, созданных на шаге 2, вызвав IMFASFProfile::CreateStream.

  4. Назначьте номер потока для созданного потока, вызвав указатель интерфейса IMFASFStreamConfig , полученный на шаге 3.

  5. При необходимости настройте поток со следующими сведениями:

  6. При необходимости задайте размер пакета данных для профиля, задав атрибуты MF_ASFPROFILE_MINPACKETSIZE и MF_ASFPROFILE_MAXPACKETSIZE . Профиль ASF предоставляет интерфейс IMFAttributes , на который приложение может получить ссылку, вызвав IMFASFProfile::QueryInterface.

  7. Задайте сведения о кодировке для потока в приемнике файлов. Обсуждается в разделе Настройка свойств в приемнике файлов.

  8. Добавьте поток в профиль, вызвав IMFASFProfile::SetStream.

  9. Свяжите профиль с объектом ContentInfo, вызвав IMFASFContentInfo::SetProfile.

Чтобы изменить существующий поток, приложение может получить ссылку на интерфейс IMFASFStreamConfig потока и перенастроить его в соответствии с требованиями. Чтобы добавить или удалить потоки, приложение должно вызвать IMFASFProfile::RemoveStream. Чтобы применить эти изменения, изменения потоковой передачи или удаления, необходимо снова задать профиль в объекте ContentInfo. Это перезаписывает существующий профиль, который уже связан с объектом ContentInfo.

//-------------------------------------------------------------------
//  CreateVideoStream
//  Create an video stream and add it to the profile.
//
//  pProfile: A pointer to the ASF profile.
//  wStreamNumber: Stream number to assign for the new stream.
//    pType: A pointer to the source's video media type.
//-------------------------------------------------------------------

HRESULT CreateVideoStream(IMFASFProfile* pProfile, WORD wStreamNumber, IMFMediaType* pType)
{
    if (!pProfile)
    {
        return E_INVALIDARG;
    }
    if (wStreamNumber < 1 || wStreamNumber > 127 )
    {
        return MF_E_INVALIDSTREAMNUMBER;
    }

    HRESULT hr = S_OK;

    
    IMFMediaType* pVideoType = NULL;
    IMFASFStreamConfig* pVideoStream = NULL;

    UINT32 dwBitRate = 0;
        
    //Create a new video type from the source type
    hr = CreateCompressedVideoType(pType, &pVideoType);
    if (FAILED(hr))
    {
        goto done;
    }

    //Create a new stream with the video type
    hr = pProfile->CreateStream(pVideoType, &pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }
    

    //Set a valid stream number
    hr = pVideoStream->SetStreamNumber(wStreamNumber);
    if (FAILED(hr))
    {
        goto done;
    }

    //Add the stream to the profile
    hr = pProfile->SetStream(pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }

    wprintf_s(L"Video Stream created. Stream Number: %d .\n", wStreamNumber);

done:

    SafeRelease(&pVideoStream);
    SafeRelease(&pVideoType);

    return hr;
}

Перечисление приемников потоков

Для каждого потока в профиле, о котором известно объекту ContentInfo, приемник файлов ASF создает и добавляет приемник потока, содержащий все свойства закодированного потока. Приемник файлов ASF предназначен для хранения фиксированных потоков. Это означает, что невозможно добавить или удалить потоки, вызвав IMFMediaSink::AddStreamSink или IMFMediaSink::RemoveStreamSink. Эти вызовы в приемнике файлов завершаются сбоем с кодом ошибки MF_E_STREAMSINKS_FIXED. Добавление или удаление потоков в профиле не приводит к автоматическому добавлению или удалению приемников потоков в приемнике файлов. Если потоки в профиле были изменены, необходимо удалить существующий экземпляр файла и повторно создать его с новыми сведениями о потоке.

В следующей процедуре приведены общие шаги по перечислению приемников потоков в приемнике файлов ASF.

Перечисление приемников потоков

  1. Вызовите IMFMediaSink::GetStreamSinkCount , чтобы получить общее количество приемников потоков в приемнике файлов ASF.

  2. Цикл по приемникам потока и получение ссылки на интерфейс GetStreamSinkByIndex приемника потока.

    -или-

    Вызовите IMFMediaSink::GetStreamSinkById , чтобы получить приемник потока, указав номер потока. Каждый приемник потока определяется номером потока, заданным при создании потока в профиле.

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

Приемники мультимедиа ASF

Поддержка ASF в Media Foundation