다음을 통해 공유


샘플을 작성하려면

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

작성 중인 파일에 대한 입력을 식별하고 구성한 경우 작성기에 샘플을 전달하기 시작할 수 있습니다. 작성 프로세스를 보다 효율적으로 만들려면 가능한 경우 프레젠테이션 시간 순서로 샘플을 전달해야 합니다.

샘플을 전달하기 전에 IWMWriter::BeginWriting을 호출하여 수락하도록 작성기를 설정해야 합니다.

작성기에 샘플을 전달하려면 다음 단계를 수행합니다.

  1. 버퍼를 할당하고 IWMWriter::AllocateSample을 호출하여 INSSBuffer 인터페이스에 대한 포인터를 검색합니다.
  2. INSSBuffer::GetBuffer를 호출하여 1단계에서 만든 버퍼의 주소를 검색합니다.
  3. 샘플 데이터를 버퍼 위치에 복사하여 전달된 샘플이 할당된 버퍼에 맞는지 확인합니다. 메모리 복사 함수를 사용하여 데이터를 복사할 수 있습니다. 일반적인 선택은 표준 C 런타임 라이브러리에 포함된 memcpy입니다.
  4. INSSBuffer::SetLength를 호출하여 샘플의 실제 크기를 반영하도록 버퍼에 사용되는 데이터 양을 업데이트합니다.
  5. IWMWriter::WriteSample 메서드를 사용하여 입력 번호 및 샘플 시간과 함께 버퍼 인터페이스를 기록기에 전달합니다. 입력에 대한 모든 오디오 샘플은 동일한 콘텐츠 기간을 나타내므로 샘플 기간을 실행 합계에 추가하여 샘플 시간을 파악할 수 있습니다. 비디오의 경우 프레임 속도에 따라 시간을 계산해야 합니다.

WriteSample 은 비동기적으로 작동하며 애플리케이션이 메서드를 다시 호출할 준비가 되기 전에 버퍼에서 데이터 쓰기를 완료하지 못할 수 있습니다. 따라서 WriteSample을 호출할 때마다 AllocateSample을 한 번 호출하는 것이 중요합니다. 그러나 WriteSample을 호출한 직후 INSSBuffer 인터페이스를 해제할 수 있습니다.

샘플 전달을 마쳤으면 IWMWriter::EndWriting을 호출합니다.

참고 파일의 모든 스트림에서 샘플을 서로 동기화하여 작성기에 전달하는 것이 중요합니다. 즉, 가능하면 IWMWriterAdvanced::SetSyncTolerance에 지정된 동기화 허용 오차 내에서 프레젠테이션 시간 순서로 작성기에 샘플을 전달해야 합니다. 데이터가 1초 이하 단위로 각 스트림에 전달될 때 최상의 결과를 달성합니다.

스트림도 거의 동시에 끝나야 합니다. 예를 들어 45초 길이의 오디오 스트림과 50초 길이의 비디오 스트림이 있는 파일을 작성해서는 안 됩니다. 이러한 파일을 비정형 입력으로 인코딩하면 스트림 끝에 있는 일부 오디오 데이터가 삭제됩니다(짧은 스트림임에도 불구하고). 파일 인코딩이 작동하도록 하려면 한 스트림이 몇 초 전에 끝나지 않도록 오디오 입력에 5초의 무음 을 추가해야 합니다. 텍스트 또는 이미지 스트림과 같은 일시적인 샘플이 있는 스트림 형식이 이러한 방식으로 패딩될 필요는 없습니다. 스크립트 명령 스트림도 이러한 모든 규칙을 따라야 합니다.

INSSBuffer 인터페이스

IWMWriter 인터페이스

ASF 파일 작성