Создание профиля ASF
В этом разделе описывается создание профиля ASF в Microsoft Media Foundation.
- Создание нового профиля
- Получение профиля из объекта ASF ContentInfo
- Получение профиля из дескриптора презентации
- Связанные темы
Создание нового профиля
Чтобы создать пустой профиль ASF, вызовите функцию MFCreateASFProfile . Эта функция возвращает указатель на интерфейс IMFASFProfile . Приложение может использовать этот интерфейс для добавления потоков в профиль и настройки каждого из потоков. Дополнительные сведения см. в статье Создание и настройка потоков ASF.
При необходимости приложение может добавлять объекты взаимного исключения в два или более потоков. См . раздел Использование взаимного исключения для потоков ASF.
Получение профиля из объекта ASF ContentInfo
Приложение может получить профиль ASF существующего ASF-файла из объекта ASF ContentInfo. Профиль уже настроен и содержит параметры для всех потоков в файле.
Инициализируйте объект ContentInfo, проанализировав объект заголовка ASF файла. Это делается с помощью метода IMFASFContentInfo::P arseHeader . После считывания всех объектов заголовков и заполнения библиотеки ASF создается профиль для этого файла. Приложение может получить указатель на этот инициализированный профиль, вызвав IMFASFContentInfo::GetProfile.
Получение профиля из дескриптора презентации
Объект профиля существующего ASF-файла можно получить из дескриптора презентации для файла или из объекта ASF ContentInfo . В этом случае профиль уже настроен и содержит параметры для всех потоков в файле. Это может быть полезно, если вы хотите изменить существующий профиль ASF. Например, может потребоваться повторно закодировать файл Windows Media Video с более низкой скоростью.
Чтобы получить профиль из дескриптора презентации, вызовите MFCreateASFProfileFromPresentationDescriptor. Эта функция анализирует дескриптор презентации и заполняет профиль ASF сведениями о файле мультимедиа. Функция возвращает указатель на интерфейс IMFASFProfile. Затем этот интерфейс можно использовать для изменения профиля.
Чтобы получить дескриптор презентации, вызовите один из следующих методов:
- Из источника мультимедиа ASF вызовите IMFMediaSource::CreatePresentationDescriptor.
- Из объекта ASF ContentInfo вызовите IMFASFContentInfo::GeneratePresentationDescriptor. Перед вызовом этого метода убедитесь, что объект ContentInfo инициализирован для чтения. Дополнительные сведения см. в разделе "Инициализация объекта ContentInfo из существующего ASF-файла" статьи Чтение объекта заголовка ASF существующего файла. Однако если у вас уже есть инициализированный объект ContentInfo, профиль можно получить непосредственно из него. Это описано в разделе "Получение профиля из объекта ContentInfo" далее в этом разделе.
В следующем примере показано, как создать профиль из дескриптора презентации. Функция создает источник мультимедиа для файла, получает дескриптор презентации из источника мультимедиа и создает профиль. В этом примере предполагается, что pszFileName указывает URL-адрес ASF-файла.
HRESULT GetASFProfile(PCWSTR pszFileName, IMFASFProfile** ppProfile)
{
*ppProfile = NULL;
IMFSourceResolver* pResolver = NULL;
IUnknown* pSourceUnk = NULL;
IMFMediaSource* pSource = NULL;
IMFPresentationDescriptor* pPD = NULL;
// Create the source resolver.
HRESULT hr = MFCreateSourceResolver(&pResolver);
// Use the source resolver to create the media source.
if (SUCCEEDED(hr))
{
MF_OBJECT_TYPE ObjectType;
hr = pResolver->CreateObjectFromURL(
pszFileName,
MF_RESOLUTION_MEDIASOURCE,
NULL,
&ObjectType,
&pSourceUnk
);
}
// Get the IMFMediaSource interface from the media source.
if (SUCCEEDED(hr))
{
hr = pSourceUnk->QueryInterface(IID_PPV_ARGS(&pSource));
}
// Get the presentation descriptor.
if (SUCCEEDED(hr))
{
hr = pSource->CreatePresentationDescriptor(&pPD);
}
// Get the profile from the presentation descriptor.
if (SUCCEEDED(hr))
{
hr = MFCreateASFProfileFromPresentationDescriptor(pPD, ppProfile);
}
SafeRelease(&pResolver);
SafeRelease(&pSourceUnk);
SafeRelease(&pSource);
SafeRelease(&pPD);
return hr;
}
В этом примере safeRelease используется для освобождения указателей интерфейса.
Связанные темы