다음을 통해 공유


타사 코덱을 사용하여 ASF 파일을 만들려면

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

Windows Media Format SDK를 사용하여 선택한 코덱으로 인코딩된 디지털 미디어를 포함하는 ASF 파일을 만들 수 있습니다. 이 SDK에 포함된 코덱 이외의 코덱을 사용하는 경우 다음 단계를 수행해야 합니다.

  1. 원하는 코덱으로 콘텐츠를 인코딩합니다.
  2. GUID 값을 찾거나 만들어 1단계에서 사용된 코덱으로 인코딩된 콘텐츠를 식별합니다.
  3. 새 프로필을 만들거나 인코딩된 콘텐츠에 사용할 기존 프로필을 수정합니다.
    • 적절한 주 형식으로 인코딩된 콘텐츠에 대한 스트림을 만듭니다. 주요 미디어 유형에 대한 자세한 내용은 미디어 유형을 참조하세요. 2단계에서 식별된 GUID를 미디어 하위 형식으로 사용합니다.
    • 스트림의 비트 속도 및 버퍼 창을 버퍼 오버플로가 발생하지 않는 값으로 설정합니다. 인코딩 시 코덱에서 이러한 값을 가져올 수 있어야 합니다. SDK 런타임 구성 요소는 비트 전송률/버퍼 창 값을 검사 지정된 데이터를 이러한 값에 맞게 만들기 위해 필요한 경우 샘플을 삭제합니다. 값을 잘못 설정하면 파일이 제대로 스트리밍되지 않아 재생이 실패합니다.
    • 비디오 스트림의 경우 WMVIDEOINFOHEADER 구조체에 포함된 BITMAPINFOHEADER 구조체의 biCompression 멤버를 콘텐츠에 대한 적절한 FOURCC 값으로 설정해야 합니다. 이 값은 하위 형식 GUID의 처음 4바이트와 같아야 합니다. 예를 들어 biCompression 이 MAKEFOURCC('T','E','S','T')=0x54455354 경우 하위 형식 GUID는 다음과 같이 시작됩니다. 54455354-XXXX-XXXX-XXXX-XXXX-XXXXXXXXXX.
  4. 기록기 개체를 만들고 이전 단계에서 만든 프로필을 로드합니다. 파일 작성에 대한 자세한 내용은 ASF 파일 작성을 참조하세요.
  5. 파일의 입력을 반복하고 평소와 같이 각각에 대한 입력 속성을 할당합니다. 입력에 대한 자세한 내용은 입력 작업을 참조 하세요. 타사 코덱으로 인코딩된 스트림의 경우 IWMWriter::BeginWriting을 호출하기 전에 IWMInputMediaProps 인터페이스 포인터를 NULL로 설정합니다.
  6. 이전 단계에서 만든 새 프로필을 사용하여 파일을 작성합니다. IWMWriter::WriteSample 대신 IWMWriterAdvanced::WriteStreamSample을 사용하여 압축된 샘플을 전달합니다. 비디오의 경우 WM_SF_CLEANPOINT dwFlags 매개 변수로 전달하여 키 프레임인 샘플을 지정해야 합니다.

타사 코덱으로 인코딩된 스트림을 처리하고 압축 해제하려면 압축된 스트림 샘플을 읽어야 합니다. 읽기 애플리케이션은 스트림에 대한 샘플 압축 해제도 처리해야 합니다.

MPEG-2 스트림을 ASF에 배치

참고

이 항목은 WINDOWS Media Format SDK를 사용하여 MPEG-2(또는 B 프레임을 사용하는 다른 압축 형식)를 ASF 파일 컨테이너에 넣는 애플리케이션에 적용됩니다.

 

기록기 개체를 사용하려면 모든 입력 샘플에 타임스탬프를 지정해야 하며 각 입력 샘플에 이전 입력 샘플보다 늦게 프레젠테이션 시간이 있다고 가정합니다. 압축되지 않은 거의 모든 비디오와 일부 압축된 비디오 스트림도 이러한 조건을 충족하지만 MPEG-2 스트림은 그렇지 않습니다. MPEG-2에서는 모든 샘플에 타임스탬프를 적용하지 않으며 B 프레임이 있는 경우 샘플 디코딩 순서가 렌더링 순서와 동일하지 않습니다. 기록기 개체에서 순서가 잘못된 샘플이 발견되면 "올바른" 순서로 다시 정렬됩니다. 따라서 기본적으로(디코딩되지 않음) MPEG-2 스트림을 ASF 컨테이너에 저장하려면 다음 단계를 수행해야 합니다.

파일을 작성할 때 다음을 수행합니다.

  1. 각 입력 샘플에 실제 MPEG 타임스탬핑 시작 시간 및 샘플의 중지 시간 값이 포함된 구조를 포함하는 DUE(고정 크기 데이터 단위 확장)를 추가합니다. 샘플에 타임스탬프를 사용하지 않는 경우 이러한 값에 -1을 사용합니다.
  2. 항상 증가하는 기록기 개체 "더미" 입력 타임스탬프를 제공하면 샘플이 수신된 순서와 정확히 동일한 순서로 파일에 기록됩니다. 더미 타임스탬프는 시간 경과에 따른 평균과 같이 실제 프레젠테이션 시간과 거의 일치해야 합니다. 더미 타임스탬프는 검색 타임라인 형성하므로 실시간 스탬프를 기준으로 분기하는 경우 파일에 대한 검색 작업은 예기치 않은 결과를 생성합니다. 그러나 샘플 시간 사이에 제한된 양의 지터는 검색 작업에 심각한 영향을 미치지 않습니다.

파일을 읽을 때:

  • 파일에서 읽은 각 샘플에 대해 DUE를 검사합니다. 0보다 크거나 같은 시작 시간이 포함된 경우 디코더에 전달되기 전에 출력 샘플의 타임스탬프를 해당 값으로 복사합니다. 출력 샘플의 다른 모든 타임스탬프를 NULL로 설정합니다. DirectShow에서 이 작업은 IMediaSample::SetTime(NULL,NULL)을 호출하여 수행됩니다.

콘텐츠 버퍼링

IWMWriter 인터페이스

IWMWriterAdvanced 인터페이스

비동기 판독기를 사용하여 압축된 샘플을 제공하려면

동기 판독기를 사용하여 스트림 샘플을 검색하려면

WMVIDEOINFOHEADER

프로필 작업

ASF 파일 작성