다음을 통해 공유


타사 코덱을 사용하여 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-XXXXXXXXXXXX.
  4. 기록기 개체를 만들고 이전 단계에서 만든 프로필을 로드합니다. 파일 작성에 대한 자세한 내용은 ASF 파일 쓰기참조하세요.
  5. 파일의 입력을 반복하고 평소처럼 각각에 대한 입력 속성을 할당합니다. 입력에 대한 자세한 내용은 입력 작업을 참조하세요. 타사 코덱으로 인코딩된 스트림의 경우 IWMWriter::BeginWriting호출하기 전에 IWMInputMediaProps 인터페이스 포인터를 NULL 설정합니다.
  6. 이전 단계에서 만든 새 프로필을 사용하여 파일을 작성합니다. IWMWriter::WriteSample대신 IWMWriterAdvanced::WriteStreamSample 사용하여 압축된 샘플을 전달합니다. 비디오의 경우 dwFlags 매개 변수로 WM_SF_CLEANPOINT 전달하여 키 프레임인 샘플을 지정해야 합니다.

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

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 파일 작성하기