Добавление сведений о потоке в приемник файлов ASF
Приемник файлов ASF — это реализация IMFMediaSink , предоставляемая Media Foundation, которую приложение может использовать для архивации данных мультимедиа ASF в файл. Сведения об объектной модели приемников мультимедиа ASF и общем использовании см. в разделе Приемники мультимедиа ASF.
После создания экземпляра приемника файлов его необходимо настроить перед созданием топологии. Приемник файлов должен знать о потоках в выходном файле, сведения о режиме кодирования и метаданных. В этом разделе описывается процесс добавления потока в приемник файлов.
Добавление потоков в приемник файлов ASF
Приемник файлов должен знать о выходных потоках и их свойствах, чтобы он смог соответствующим образом создавать выходные примеры и добавлять их в выходной ASF-файл. Эти параметры записываются в окончательный объект заголовка ASF.
Чтобы задать сведения о потоке, необходимо иметь ссылку на объект ASF ContentInfo приемника файла. Дополнительные сведения см. в разделе Создание приемника файлов ASF.
В следующей процедуре приведены общие шаги по настройке потока с помощью объекта профиля ASF.
Настройка сведений о потоке в приемнике файлов ASF
Создайте объект профиля ASF, вызвав MFCreateASFProfile.
Для каждого потока в выходном файле создайте тип мультимедиа для целевого потока, который будет добавлен в приемник файлов. Тип носителя должен быть совместим с типами выходных данных, поддерживаемыми кодировщиками Windows Media.
Сведения о добавлении аудиопотоков в профиль см. в разделе Создание аудиопотоков для кодирования ASF.
Сведения о добавлении видеопотоков в профиль см. в разделе Создание видеопотоков для кодирования ASF.
Создайте потоки на основе типов мультимедиа, созданных на шаге 2, вызвав IMFASFProfile::CreateStream.
Назначьте номер потока для созданного потока, вызвав указатель интерфейса IMFASFStreamConfig , полученный на шаге 3.
При необходимости настройте поток со следующими сведениями:
- Параметры контейнера с утечкой, задав атрибуты : MF_ASFSTREAMCONFIG_LEAKYBUCKET1 или MF_ASFSTREAMCONFIG_LEAKYBUCKET2
- Расширение полезных данных, взаимное исключение путем вызова методов IMFASFStreamConfig .
При необходимости задайте размер пакета данных для профиля, задав атрибуты MF_ASFPROFILE_MINPACKETSIZE и MF_ASFPROFILE_MAXPACKETSIZE . Профиль ASF предоставляет интерфейс IMFAttributes , на который приложение может получить ссылку, вызвав IMFASFProfile::QueryInterface.
Задайте сведения о кодировке для потока в приемнике файлов. Обсуждается в разделе Настройка свойств в приемнике файлов.
Добавьте поток в профиль, вызвав IMFASFProfile::SetStream.
Свяжите профиль с объектом 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.
Перечисление приемников потоков
Вызовите IMFMediaSink::GetStreamSinkCount , чтобы получить общее количество приемников потоков в приемнике файлов ASF.
Цикл по приемникам потока и получение ссылки на интерфейс GetStreamSinkByIndex приемника потока.
-или-
Вызовите IMFMediaSink::GetStreamSinkById , чтобы получить приемник потока, указав номер потока. Каждый приемник потока определяется номером потока, заданным при создании потока в профиле.
При создании частичной топологии для кодирования файла мультимедиа необходимо добавить приемник файла в топологию в качестве узла выходной топологии. Это можно сделать, указав каждый приемник пара в приемнике файлов или задав объект активации приемника файлов и идентификаторы приемника потока. Дополнительные сведения и пример кода см. в разделе Создание выходных узлов.
Связанные темы