다음을 통해 공유


표식 사용

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

식은 ASF 파일 내의 명명된 점입니다. 각 표식은 파일 시작부터 오프셋으로 측정된 이름과 연결된 시간으로 구성됩니다. 애플리케이션은 마커를 사용하여 콘텐츠 내의 다양한 지점에 이름을 할당하고 사용자에게 해당 이름을 표시한 다음 표식 위치를 검색할 수 있습니다. 애플리케이션은 기존 ASF 파일에서 마커를 추가하거나 제거할 수 있습니다.

IWMHeaderInfo 인터페이스에는 표식 작업을 위한 메서드가 포함되어 있습니다. 메타데이터 편집기 개체는 표식 추가 및 제거를 지원합니다. 기록기 및 판독기 개체는 표식을 검색할 수 있지만 표식을 추가하거나 제거할 수는 없습니다.

표식 추가

마커를 추가하려면 IWMHeaderInfo 인터페이스에 대한 메타데이터 편집기를 쿼리합니다. 그런 다음 표식 이름을 와이드 문자열로 지정하고 시간을 100나노초 단위로 지정하여 IWMHeaderInfo::AddMarker 메서드를 호출합니다. 시간은 파일 기간을 초과해서는 안됩니다. 두 표식은 동일한 시간을 가질 수 있습니다.

다음 예제에서는 파일에 여러 표식을 추가합니다.

IWMMetadataEditor *pEdit = 0;
IWMHeaderInfo     *pInfo = 0;

// Create the metadata editor object.

WMCreateEditor(&pEdit);
pEdit->Open(L"C:\\example.wmv");
pEdit->QueryInterface(IID_IWMHeaderInfo, (void**)&pInfo);

// Add the markers. Note that we add the last ones first. Do this when possible
// for improved performance when writing the markers to the file.
hr = pInfo->AddMarker(L"End",  520000000);   // 52 sec.
hr = pInfo->AddMarker(L"Segue",  350000000); // 35 sec.
hr = pInfo->AddMarker(L"Intro",  15000000);  // 1.5 sec.

// Commit changes and clean up.

pEdit->Flush();
pEdit->Close(); 
pInfo->Release();
pEdit->Release();

표식 제거

표식을 제거하려면 IWMHeaderInfo::RemoveMarker를 호출하여 제거할 표식의 인덱스 를 지정합니다. 표식은 시간 순서대로 자동으로 정렬되므로 인덱스 0은 항상 첫 번째 표식입니다. RemoveMarker를 호출하면 뒤에 나타나는 표식의 인덱스 번호가 변경됩니다. pInfoIWMHeaderInfo 인터페이스에 대한 포인터인 다음 코드는 파일에서 모든 마커를 제거합니다.

WORD count = 0;
pInfo->GetMarkerCount(&count);
while (count--)
{
    pInfo->RemoveMarker(0);
}

표식 검색

표식의 이름과 시간을 검색하려면 다음 단계를 수행합니다.

  1. IWMHeaderInfo::GetMarkerCount 메서드를 호출하여 파일에 포함된 표식 수를 확인합니다.
  2. 표식 이름을 포함하는 데 필요한 문자열의 크기를 검색합니다. 이렇게 하려면 IWMHeaderInfo::GetMarker 메서드를 호출합니다. 검색할 표식의 인덱스를 지정하고 문자열 버퍼(pwszMarkerName 매개 변수)에 대해 NULL을 지정합니다. 메서드는 pcchMarkerNameLen 매개 변수에서 종결 '\0' 문자를 포함하여 문자열의 길이를 반환합니다.
  3. 이름을 받을 와이드 문자열을 할당합니다.
  4. GetMarker를 다시 호출하지만 이번에는 pwszMarkerName 매개 변수에서 문자열의 주소를 전달합니다. 메서드는 표식 이름을 문자열에 쓰고 pcnsMarkerTime 매개 변수의 표식 시간을 반환합니다.

다음 코드는 모든 마커를 순서대로 반복하고 이름과 시간을 검색합니다.

WORD cMarkers = 0;
HRESULT hr = pInfo->GetMarkerCount(&cMarkers);

WCHAR *wszName = 0;
WORD  len = 0;
for (WORD iMarker = 0; iMarker < cMarkers; ++iMarker)
{
    QWORD rtTime = 0;
    WORD req_len = 0;
    hr = pInfo->GetMarker(iMarker, 0, &req_len, &rtTime);
    
    // Reallocate if necessary.
    if (len < req_len)
    {
        delete[] wszName;
        wszName = new WCHAR[req_len];
        len = req_len;
    }
    hr = pInfo->GetMarker(iMarker, wszName, &req_len, &rtTime);
    // Display the name...
}
delete[] wszName;

표식 찾기

표식 위치에서 재생을 시작하려면 판독기 개체의 IWMReaderAdvanced2::StartAtMarker 메서드를 호출하여 표식의 인덱스 지정을 지정합니다. 나머지 매개 변수는 IWMReader::Start 메서드의 매개 변수와 동일합니다. 다음 예제에서는 IWMReaderAdvanced2 인터페이스에 대한 판독기를 쿼리하고 첫 번째 마커를 찾습니다.

IWMReaderAdvanced2 *pReader2 = 0
WORD iMarkerIndex = 0;
hr = pReader->QueryInterface(IID_IWMReaderAdvanced2, (void**)&pReader2);
if (SUCCEEDED(hr))
{
    hr = pPlayer2->StartAtMarker(iMarkerIndex, 0, 1.0, 0);
    pPlayer2->Release();
}

IWMHeaderInfo 인터페이스

IWMReaderAdvanced2::StartAtMarker

메타데이터 작업