다음을 통해 공유


ASF 미디어 소스

Media Foundation은 애플리케이션이 아키텍처의 파이프라인 계층에서 ASF 파일을 나타내는 데 사용할 수 있는 ASF 미디어 원본을 제공합니다.

ASF 파일을 재생하기 위해 애플리케이션은 ASF 미디어 원본을 사용하여 데이터를 재생 파이프라인에 공급할 수 있습니다. 인코딩 시나리오에서 애플리케이션은 ASF 미디어 원본을 원본으로 사용하여 다른 형식으로 변환하거나 더 높은 비트 전송률 파일을 형식을 변경하지 않고 더 낮은 비트 전송률 파일로 변환할 수 있습니다. ASF 미디어 원본은 파이프라인 계층에서 사용해야 합니다. 즉, 애플리케이션이 미디어 세션을 사용하여 작업을 제어해야 합니다. 이 액세스 수준을 사용하면 미디어 세션이 진행되는 동안 애플리케이션에서 이벤트를 가져올 수 있습니다. ASF 콘텐츠에 대한 낮은 수준의 액세스를 얻으려면 애플리케이션에서 WMContainer Layer ASF 구성 요소를 사용해야 합니다.

ASF 미디어 원본은 미디어 파운데이션의 미디어 원본에 대한 제네릭 인터페이스인 IMFMediaSource 인터페이스를 구현합니다. 다른 미디어 원본과 마찬가지로 ASF 미디어 원본은 주로 ASF 헤더 개체를 설명하는 프레젠테이션 설명자를 제공합니다. 또한 ASF 미디어 원본은 미디어 콘텐츠의 각 스트림을 나타내는 스트림 설명자를 제공합니다. 자세한 내용은 ASF 파일 구조를 참조 하세요.

ASF 미디어 원본 만들기

ASF 미디어 원본을 만들려면 애플리케이션에서 원본 확인자를 사용해야 합니다. ASF 미디어 원본을 만들려면 애플리케이션에서 원본 확인자에서 ASF 미디어 원본을 만드는 원본을 제공해야 합니다. 원본 정보는 원본 파일의 URL 또는 미디어가 포함된 바이트 스트림을 지정하여 제공해야 합니다. 애플리케이션이 URL을 지정하여 ASF 미디어 원본을 만들도록 선택하는 경우 동기 작업을 위해 IMFSourceResolver::CreateObjectFromURL호출하거나 IMFSourceResolver::Begin... 비동기 작업을 위한 EndCreateObjectFromURL입니다. 바이트 스트림에서 미디어 원본을 만드는 프로세스는 비슷합니다. 애플리케이션은 동기 작업을 위해 IMFSourceResolver::CreateObjectFromByteStream을 호출하거나 IMFSourceResolver::Begin... 비동기 작업을 위한 EndCreateObjectFromBytestream입니다. 이러한 호출은 dwFlags 매개 변수에서 MF_RESOLUTION_MEDIASOURCE 지정해야 합니다. 이 플래그를 사용하는 방법에 대한 자세한 내용은 원본 확인자 사용을 참조하세요.

애플리케이션이 URL을 지정하는 경우 로컬 파일의 경우 URL 문자열에 미디어 파일의 경로가 포함되거나 "file: "scheme" 접두사를 지정할 수 있습니다. 파일 이름 확장명은 ".asf", ".wm", L".wma" 또는 ".wmv"이어야 합니다. 네트워크의 ASF 파일의 경우 원본 확인자는 ASF 미디어 원본을 사용하는 네트워크 원본을 만듭니다.

개체를 만드는 동안 원본 확인자는 시스템 레지스트리에서 스키마 처리기 및 바이트 스트림 처리기 목록을 조회하고 미디어 콘텐츠를 구문 분석하고 그 아래에 미디어 원본 개체를 만들 수 있는 가장 가까운 일치 처리기를 로드합니다. 미디어 원본(URL 및 바이트 스트림)을 만드는 데 사용되는 메서드와 관계없이 원본 확인자는 바이트 스트림을 만들고 원본 미디어의 콘텐츠를 바이트 스트림으로 읽습니다. 자세한 내용은 스키마 처리기 및 바이트 스트림 처리기를 참조 하세요.

미디어 원본을 만드는 방법에 대한 코드 예제는 원본 확인자 사용을 참조 하세요.

ASF 미디어 원본에 대한 구성 설정

원본 확인자는 기본 바이트 스트림의 기능을 쿼리하고 새로 만든 미디어 원본에서 작업이 허용되는지 확인합니다. 이러한 기능 중 하나는 추구하는 것입니다. 검색 작업이 허용되는 경우 애플리케이션은 프레젠테이션의 특정 지점을 검색하는 동안 미디어 소스에서 사용하는 검색 모드를 지정할 수 있습니다.

애플리케이션은 개체를 만드는 동안 미디어 소스에서 사용할 검색 모드를 설정할 수 있습니다. 지정된 검색 모드를 사용하여 ASF 미디어 원본을 만든 후에는 미디어 원본에서 수정하거나 프레젠테이션 중에 동적으로 변경할 수 없습니다. 기본 설정 검색은 미디어 원본을 만드는 데 사용되는 관련 소스 확인자 메서드에 대한 애플리케이션 호출의 속성으로 지정됩니다. 이러한 속성 집합은 속성 저장소에서 설정되고 pProps 매개 변수에 전달됩니다. 이러한 속성이 전달되지 않으면 미디어 원본이 기본 설정을 사용하여 작동합니다. 이러한 속성을 설정하는 방법에 대한 자세한 내용은 미디어 원본 구성을 참조하세요.

검색이 허용되는 경우 ASF 미디어 원본은 다음 검색 모드를 지원합니다.

  • 정확한 검색: 이 모드에서 ASF 미디어 원본은 ASF 파일의 ASF 인덱스 개체를 사용합니다. 파일에 Index 개체가 없으면 정확한 검색이 비활성화되고 미디어 원본에 설정된 애플리케이션 지정 속성에 따라 다른 모드 중 하나가 사용됩니다.
  • 대략적인 검색: 이 모드는 속성 저장소의 MFPKEY_ASFMediaSource_ApproxSeek 관련 소스 확인자 메서드에 전달하여 애플리케이션에서 요청합니다. 그러나 대략적인 검색은 바이트 스트림이 시간 기반 검색을 지원하지 않는 경우에만 사용됩니다. 이 모드에서 미디어 원본은 검색 시간에 상대적으로 가까운 시작 시간을 결정합니다. ASF 파일에 ASF 인덱스 개체가 포함된 경우 시작 시간을 계산하는 데 사용됩니다. 대략적인 검색은 정확도가 낮지만 정확한 검색보다 빠릅니다. 미리 결정된 시작 시간에 첫 번째 샘플을 렌더링하는 데 걸린 시간이 더 빠르기 때문입니다.
  • 반복 검색: 이 모드를 설정하려면 애플리케이션이 MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex 속성을 설정해야 합니다. 반복 검색은 ASF 인덱스 개체가 없는 ASF 파일에서 위치를 찾는 알고리즘입니다. 이 모드에서 미디어 원본은 바이트 스트림 오프셋을 읽어 검색 지점의 대략적인 예상을 결정합니다. 평균 비트 전송률에 따라 일련의 근사치를 사용하여 대상 검색 시간에 점점 더 가까워지도록 합니다. (알고리즘은 이진 검색과 유사합니다.) 반복 검색은 Index 개체를 사용하여 검색하는 것보다 오래 걸릴 수 있으므로 기본적으로 사용하지 않도록 설정됩니다. 이 속성을 설정하는 경우 다음 속성을 사용하여 검색 매개 변수를 설정합니다. MFPKEY_ASFMediaSource_IterativeSeek_Max_Count MFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. 이러한 속성은 반복의 최대 수와 허용 오차를 각각 설정합니다. 이 알고리즘은 최대 반복 수에 도달하거나 검색 시간으로부터의 거리가 지정된 허용 오차 내에 있는 패킷을 찾으면 중지됩니다.

간단히 말해서, 애플리케이션은 ASF 파일에 ASF 인덱스 개체가 없는 경우 근사값 또는 반복 검색을 선택할 수 있습니다.

ASF 미디어 원본 개체 모델

ASF 미디어 원본은 IMFMediaSource 인터페이스를 구현하고 다음 인터페이스를 노출합니다. 애플리케이션은 ASF 미디어 원본에서 IMFMediaSource::QueryInterface를 호출하여 이러한 인터페이스에 대한 참조를 가져올 수 있습니다.

인터페이스 설명
IMFMediaSource 모든 미디어 원본에 필요합니다.
IMFMediaEventGenerator 모든 미디어 원본에 필요합니다. 애플리케이션에서 미디어 세션을 통해 미디어 원본에서 이벤트를 가져올 수 있습니다.
IMFGetService 미디어 원본에 지정된 서비스 인터페이스를 쿼리합니다.
IPropertyStore 미디어 원본의 속성을 설정하고 가져옵니다. 각 속성에는 설명이 포함된 이름과 값이 포함됩니다.
IMFMetadata ASF 파일의 메타데이터를 설명합니다.
IMFMetadataProvider 전체 프레젠테이션 또는 프레젠테이션의 한 스트림에 대한 메타데이터 컬렉션을 검색합니다.
IMFRateSupport 역방향 재생을 포함하여 지원되는 재생 속도의 범위를 쿼리합니다.
IMFRateControl 재생 속도를 가져오거나 설정합니다.
IMFTrustedInput 원본에 포함된 각 ASF 스트림에 대한 ITA를 가져옵니다.
IMFPMPClient 미디어 원본이 PMP 프로세스에서 개체를 만드는 데 사용되는 IMFPMPHost 인터페이스에 대한 포인터를 받을 수 있도록 합니다.
IMFTimecodeTranslate 영화 협회와 텔레비전 엔지니어(SMPTE) 시간 코드와 100나노초 시간 단위를 변환합니다.

 

ASF 미디어 원본 서비스

ASF 미디어 원본은 ASF 파일의 범위가 지정된 다양한 서비스를 제공합니다. 특정 서비스에 대한 포인터를 얻으려면 애플리케이션이 MFGetService 호출에서 다음 서비스 식별자 중 하나를 사용해야 합니다. 자세한 내용은 서비스 인터페이스를 참조 하세요.

서비스 식별자 설명
MF_RATE_CONTROL_SERVICE 애플리케이션은 이 식별자를 사용하여 IMFRateSupport 또는 IMFRateControl 인터페이스에 대한 포인터를 가져올 수 있습니다. 애플리케이션은 미디어 원본에 의해 구현된 속도 지원 개체를 사용하여 기본 ASF 미디어 파일에서 특정 속도를 지원하는지 확인할 수 있습니다. 애플리케이션에서 속도 제어 개체를 사용하여 재생 속도를 가져와서 설정할 수 있습니다. 애플리케이션이 재생에 대한 특정 속도를 지정하는 경우 ASF 미디어 원본은 먼저 요청된 속도가 속도 제한(속도 제한(가장 빠른 속도 및 가장 느린 속도에 의해 결정됨)에 속하는지 확인한 다음 속도를 설정합니다. 비트 전송률이 네트워크 대역폭에 따라 잠시 변경될 수 있으므로 변수 조건을 확인하지 않습니다. 자세한 내용은 Rate Control을 참조하세요.
MF_METADATA_PROVIDER_SERVICE 애플리케이션은 이 식별자를 사용하여 ASF 미디어 원본의 IMFMetadataProvider 인터페이스에 대한 포인터를 가져올 수 있습니다. 이 인터페이스는 ASF 파일, 특히 ASF 헤더 개체 및 미디어 콘텐츠에 포함된 스트림에 대한 정보에 대한 액세스를 제공합니다. 헤더 정보는 프레젠테이션 설명자 특성을 통해 노출되고 스트림 정보는 스트림 설명자 특성을 통해 제공됩니다. 이러한 특성에 대한 자세한 내용은 ASF 헤더 개체에 대한 Media Foundation 특성을 참조 하세요. 특성을 통해 노출되는 정보 외에도 속성으로 설정된 설명이 포함된 메타데이터도 있습니다.
MF_PROPERTY_HANDLER_SERVICE 애플리케이션은 이 식별자를 사용하여 ASF 미디어 원본의 IPropertyStore 인터페이스에 대한 포인터를 가져올 수 있습니다. 속성 저장소에는 ASF 파일과 관련된 모든 메타데이터가 포함됩니다. 이 식별자는 Windows 7의 새로운 기능이며 메타데이터 속성을 가져오기 위한 MF_METADATA_PROVIDER_SERVICE 대체합니다.
MFNETSOURCE_STATISTICS_SERVICE 자세한 내용은 클라이언트 로깅에서 네트워크 통계 검색을 참조하세요.
MF_TIMECODE_SERVICE 애플리케이션은 이 식별자를 사용하여 미디어 원본의 IMFTimecodeTranslate 인터페이스에 대한 포인터를 가져올 수 있습니다. 이 구현은 SMPTE 시간 코드를 100나노 초 단위로 변환하는 것과 같은 시간 코드 변환을 수행하는 데 사용할 수 있습니다.

 

시간 코드 변환

ASF 미디어 소스는 애플리케이션이 SMPTE 시간 코드를 가장 가까운 프레젠테이션 시간(100나노초 단위)으로 변환할 수 있도록 하는 시간 코드 변환 서비스를 제공합니다. 반대로 애플리케이션은 요청된 프레젠테이션 시간에 대한 시간 코드를 가져올 수도 있습니다. 이 서비스는 ASF 미디어 소스가 구현하는 IMFTimecodeTranslate 인터페이스를 통해 사용할 수 있습니다. 이 인터페이스 포인터에 대한 메서드 호출은 애플리케이션의 사용자 인터페이스를 차단하지 않고 주 애플리케이션 스레드에서 실행할 수 있는 비동기입니다.

다음 단계에서는 시간 코드 변환 절차를 요약합니다.

  1. MFGetService호출하고 MF_TIMECODE_SERVICE 식별자를 지정하여 ASF 미디어 원본의 IMFTimecodeTranslate 인터페이스에 대한 포인터를 가져옵니다.
  2. IMFTimecodeTranslate::BeginConvertTimecodeToHNS 또는 IMFTimecodeTranslate::BeginConvertHNSToTimecode를 호출하고 번역할 시간을 지정합니다. BeginConvertTimecodeToHNS의 경우 시간 코드는 VT_I8 데이터 형식의 PROPVARIANT 변수로 지정해야 합니다. BeginConvertHNSToTimecode 메서드는 MFTIME 형식으로 100나노초 단위의 시간이 필요합니다.
  3. IMFTimecodeTranslate::EndConvertTimecodeToHNS 또는 IMFTimecodeTranslate::EndConvertTimecodeToHNS를 적절하게 호출하여 비동기 작업을 완료합니다.

미디어 원본을 만드는 동안 원본 확인자는 미디어 원본이 ASF 콘텐츠를 읽는 파일에 대한 바이트 스트림을 만듭니다. 시간 변환이 성공하려면 ASF 파일과 연결된 바이트 스트림에 검색 기능이 있어야 합니다. 그렇지 않으면 애플리케이션이 Begin... 호출에서 MF_E_BYTESTREAM_NOT_SEEKABLE 오류를 가져옵니다. 시간 변환에 대한 또 다른 요구 사항은 ASF 미디어 원본으로 표현되는 ASF 파일에 ASF 인덱스 개체가 있어야 한다는 것입니다. 프레젠테이션 시간과 시간 코드는 ASF 파일에 대한 모든 인덱스 및 해당 seek-points를 유지하는 ASF 인덱스 개체에서 추출됩니다. 프레젠테이션 시간 코드 변환의 경우 ASF 파일에 단순 인덱스 개체가 포함되어야 합니다. 시간 코드-프레젠테이션 시간 변환의 경우 ASF 파일에 Index 개체가 있어야 합니다. 변환 작업은 기본 인덱서(WMContainer 구성 요소)를 사용하여 ASF 파일과 연결된 Index 개체를 구문 분석하고 읽습니다. 파일에 Index 개체가 없는 경우 애플리케이션은 MF_E_NO_INDEX 오류 코드를 비동기적으로 받습니다.

애플리케이션에서 요청한 시간을 변환하기 위해 미디어 원본은 파일 내의 스트림을 열거하고 적절한 ASF 인덱스 개체가 포함된 스트림을 찾습니다. 이러한 스트림이 발견되면 미디어 소스는 올바른 시간 코드에 도달할 때까지 스트림의 ASF 패킷을 구문 분석합니다. 올바른 샘플을 찾은 후 샘플에서 해당 프레젠테이션 시간 또는 시간 코드를 검색하고 호출자에게 반환합니다.

스크립트 명령 지원

스크립트 스트림을 포함하는 ASF 토폴로지 빌드 시 스크립트 스트림 노드가 토폴로지에 추가됩니다. 이 노드는 적절한 시간에 IMFSamples를 보냅니다. 스크립트 원본 노드에서 제공하는 IMFSample은 샘플과 연결된 IMFMediaBuffer에 데이터를 저장합니다. 샘플에서 CopyToBuffer를 호출하여 IMFMediaBuffer를 가져오고 버퍼의 Lock을 호출하여 데이터를 가져올 수 있습니다.

스크립트 스트림 페이로드는 형식 문자열로 버퍼에 압축되고, 그 다음에는 NULL, 명령 문자열, NULL이 잇습니다. 문자열은 ASF 형식의 유니코드입니다.

예를 들어 페이로드는 다음과 같을 수 있습니다(여기서 \0은 NULL 문자를 나타낸다).

URL\0http://contoso.com\0

Text\0이 캡션\0입니다.

파이프라인 계층 ASF 구성 요소

미디어 파운데이션의 ASF 지원