ASF 프로필 만들기
이 항목에서는 Microsoft Media Foundation에서 ASF 프로필로 만드는 방법을 설명합니다.
새 프로필 만들기
빈 ASF 프로필을 만들려면 MFCreateASFProfile 함수를 호출합니다. 이 함수는 IMFASFProfile 인터페이스에 대한 포인터를 반환합니다. 애플리케이션은 이 인터페이스를 사용하여 프로필에 스트림을 추가하고 각 스트림을 구성할 수 있습니다. 자세한 내용은 ASF 스트림 만들기 및 구성을 참조하세요.
필요에 따라 애플리케이션은 둘 이상의 스트림에 상호 제외 개체를 추가할 수 있습니다. ASF 스트림에 상호 제외 사용을 참조하세요.
ASF ContentInfo 개체에서 프로필 가져오기
애플리케이션은 ASF ContentInfo 개체에서 기존 ASF 파일의 ASF 프로필을 가져올 수 있습니다. 프로필은 이미 구성되어 있으며 파일의 모든 스트림에 대한 설정을 포함합니다.
파일의 ASF 헤더 개체를 구문 분석하여 ContentInfo 개체를 초기화합니다. 이 작업은 IMFASFContentInfo::P arseHeader 메서드를 통해 수행됩니다. 모든 헤더 개체를 읽고 ASF 라이브러리가 채워지면 이 파일의 프로필이 생성됩니다. 애플리케이션은 IMFASFContentInfo::GetProfile을 호출하여 이 초기화된 프로필에 대한 포인터를 가져올 수 있습니다.
프레젠테이션 설명자에서 프로필 가져오기
파일의 프레젠테이션 설명자 또는 ASF ContentInfo 개체에서 기존 ASF 파일의 프로필 개체를 가져올 수 있습니다. 이 경우 프로필은 이미 구성되어 있으며 파일의 모든 스트림에 대한 설정을 포함합니다. 이는 기존 ASF 프로필을 수정하려는 경우에 유용할 수 있습니다. 예를 들어 Windows Media Video 파일을 더 낮은 비트 속도로 다시 인코딩할 수 있습니다.
프레젠테이션 설명자에서 프로필을 얻으려면 MFCreateASFProfileFromPresentationDescriptor를 호출합니다. 이 함수는 프레젠테이션 설명자를 구문 분석하고 ASF 프로필을 미디어 파일에 대한 정보로 채웁니다. 함수는 IMFASFProfile 인터페이스에 대한 포인터를 반환합니다. 그런 다음 이 인터페이스를 사용하여 프로필을 수정할 수 있습니다.
프레젠테이션 설명자를 얻으려면 다음 메서드 중 하나를 호출합니다.
- ASF 미디어 원본에서 IMFMediaSource::CreatePresentationDescriptor를 호출합니다.
- ASF ContentInfo 개체에서 IMFASFContentInfo::GeneratePresentationDescriptor를 호출합니다. 이 메서드를 호출하기 전에 ContentInfo 개체가 읽기 위해 초기화되었는지 확인합니다. 자세한 내용은 기존 파일의 ASF 헤더 개체 읽기에서 "기존 ASF 파일에서 ContentInfo 개체 초기화"를 참조하세요. 그러나 초기화된 ContentInfo 개체가 이미 있는 경우 프로필을 직접 가져올 수 있습니다. 이 내용은 이 항목의 뒷부분에 있는 "ContentInfo 개체에서 프로필 가져오기"에 설명되어 있습니다.
다음 예제에서는 프레젠테이션 설명자에서 프로필을 만드는 방법을 보여줍니다. 함수는 파일에 대한 미디어 원본을 만들고, 미디어 원본에서 프레젠테이션 설명자를 가져오고, 프로필을 만듭니다. 이 예제에서는 pszFileName 이 ASF 파일의 URL을 지정한다고 가정합니다.
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 를 사용하여 인터페이스 포인터를 해제합니다.
관련 항목