다음을 통해 공유


샘플을 작성하려면

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