Share via


동기 판독기를 사용하여 파일 읽기

[이 페이지와 연결된 기능인 Windows Media Format 11 SDK는 레거시 기능입니다. 원본 판독기 및 싱크 작성기에 의해 대체되었습니다. 원본 판독기 및 싱크 작성기는 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 Windows Media Format 11 SDK 대신 소스 판독기 및 싱크 작성기를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

동기 판독기를 사용하여 판독기 개체의 비동기 메서드 대신 동기 호출을 사용하여 ASF 파일을 읽을 수 있습니다. 동기 호출을 사용하면 파일을 읽는 데 필요한 스레드 수가 줄어듭니다. 비동기 판독기는 스트림 처리를 위해 여러 스레드를 사용합니다. 여러 스트림이 있는 파일의 경우 사용되는 스레드 수가 매우 커질 수 있습니다. 동기 판독기는 하나의 스레드만 사용합니다.

동기 판독기는 콘텐츠 만들기 및 파일 편집 애플리케이션의 요구 사항을 충족하도록 설계되었습니다. 다른 애플리케이션에 대해 동기 판독기를 사용할 수 있지만 해당 기능은 제한적입니다.

동기 판독기는 UNC 경로 이름(예: "\\someshare\somedirectory\somefile.wmv")을 사용하여 로컬 또는 네트워크의 파일을 열 수 있습니다. 동기 판독기로 파일을 스트리밍하거나 인터넷 위치에서 파일을 열 수 없습니다. 동기 판독기는 IStream COM 인터페이스를 원본으로 사용하기 위한 지원도 제공합니다.

동기 판독기는 비동기 판독기보다 ASF 파일에서 샘플을 검색하는 데 더 다양한 기능을 제공합니다. 동기 판독기는 스트림 번호 및 출력별로 샘플을 제공할 수 있습니다. 스트림 번호로 전달되는 샘플은 압축하거나 압축 해제할 수 있습니다. 동기 판독기는 재생 중에 압축된 배달과 압축되지 않은 배달 간에 전환할 수도 있습니다. 이 기능을 "빠른 편집"이라고 합니다. 이 기능을 사용하면 편집 애플리케이션이 Windows 미디어 기반 콘텐츠를 읽고 원하는 프레임에 도달할 때까지 작성기에 직접 전달할 수 있습니다. 이 시점에서 애플리케이션은 판독기에 압축되지 않은 콘텐츠 제공을 시작하도록 지시할 수 있습니다. 그러면 애플리케이션이 수정하여 다시 압축을 위해 작성기에 전달할 수 있습니다. 애플리케이션이 지정된 프레임 수정을 완료하면 판독기에서 압축된 프레임 배달을 다시 시작하도록 지시할 수 있습니다.

동기 판독기 개체의 가장 기본적인 기능은 다음 단계로 나눌 수 있습니다. 이러한 단계에서 "애플리케이션"은 Windows Media Format SDK를 사용하여 작성하는 프로그램을 나타냅니다.

  1. 애플리케이션은 읽을 파일의 이름을 동기 판독기로 전달합니다. 동기 판독기가 파일을 열면 각 스트림에 출력 번호를 할당합니다. 파일이 상호 제외를 사용하는 경우 판독기는 상호 배타적인 모든 스트림에 대해 단일 출력을 할당합니다.
  2. 애플리케이션은 판독기에서 다양한 출력의 구성에 대한 정보를 가져옵니다. 수집된 정보를 통해 애플리케이션은 미디어 샘플을 제대로 렌더링할 수 있습니다.
  3. 애플리케이션은 동기 판독기에서 샘플을 한 번에 하나씩 요청하기 시작합니다. 동기 판독기는 INSSBuffer 인터페이스를 제공하는 버퍼 개체의 각 샘플을 제공합니다.
  4. 애플리케이션은 판독기에서 데이터를 배달한 후 렌더링할 책임이 있습니다. Windows Media Format SDK는 렌더링 루틴을 제공하지 않습니다. 일반적으로 애플리케이션은 다른 SDK를 사용하여 Microsoft Direct X SDK 또는 Microsoft Windows 플랫폼 SDK 멀티미디어 함수와 같은 데이터를 렌더링합니다.

이러한 단계는 WMSyncReader 샘플 애플리케이션에 설명되어 있습니다. 자세한 내용은 샘플 애플리케이션을 참조하세요.

동기 판독기는 고급 기능도 지원합니다. 동기 판독기를 사용하면 다음을 수행할 수 있습니다.

  • 시간 또는 프레임 번호별로 검색할 샘플 범위를 지정합니다.
  • 상호 배타적인 스트림에 대한 스트림 선택을 제어합니다.
  • 표준 COM 인터페이스인 IStream을 사용하여 파일을 엽니다.
  • 파일 헤더에서 프로필 데이터를 읽습니다.
  • 파일 헤더에서 메타데이터를 읽습니다.
  • 재생 중에 스트림과 출력 샘플 간에 전환합니다.
  • 재생 중에 압축된 스트림 샘플과 압축되지 않은 스트림 샘플 간에 전환합니다.

다음 섹션에서는 동기 판독기 개체의 사용에 대해 자세히 설명합니다.

예제 코드

다음 예제 코드는 동기 판독기를 사용하여 ASF 파일에서 샘플을 읽는 방법을 보여줍니다. 프레임 번호로 전달할 샘플 범위를 지정합니다.

IWMSyncReader* pSyncReader = NULL;
INSSBuffer*    pMyBuffer   = NULL;

QWORD cnsSampleTime = 0;
QWORD cnsSampleDuration = 0;
DWORD dwFlags = 0;
DWORD dwOutputNumber;
HRESULT hr = S_OK;

// Initialize COM.
hr = CoInitialize(NULL);

// Create a synchronous reader.
hr = WMCreateSyncReader(NULL, WMT_RIGHT_PLAYBACK, &pSyncReader);

// Open an ASF file.
hr = pSyncReader->Open(L"c:\\somefile.wmv");

// TODO: Identify the properties for each output. This works 
// exactly as it does with the asynchronous reader.

// Specify a playback range from frame number 100 of the video 
// stream to the end of the file. Assume that the video stream 
// is stream number 2.
hr = pSyncReader->SetRangeByFrame(2, 100, 0);

// Loop through all the samples in the specified range.
do
{
   // Get the next sample, regardless of its stream number.
   hr = pSyncReader->GetNextSample(0,
                                   &pMyBuffer,
                                   &cnsSampleTime,
                                   &cnsSampleDuration,
                                   &dwFlags,
                                   &dwOutputNumber,
                                   NULL);

   if(SUCCEEDED(hr))
   {
      // TODO: Process the sample in whatever way is appropriate 
      // to your application. When finished, clean up.
      pMyBuffer->Release();
      pMyBuffer = NULL;
      cnsSampleTime     = 0;
      cnsSampleDuration = 0;
      dwFlags           = 0;
      dwOutputNumber    = 0;
   }
} 
while (SUCCEEDED(hr));

pSyncReader->Release();
pSyncReader = NULL;

IWMSyncReader 인터페이스

ASF 파일 읽기

동기 판독기 개체