샘플을 작성하려면
[이 페이지와 연결된 기능인 Windows Media Format 11 SDK는 레거시 기능입니다. 원본 판독기 및 싱크 작성기에 의해 대체되었습니다. 원본 판독기 및 싱크 작성기는 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 Windows Media Format 11 SDK 대신 소스 판독기 및 싱크 작성기를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
작성 중인 파일에 대한 입력을 식별하고 구성한 경우 작성기에 샘플을 전달하기 시작할 수 있습니다. 작성 프로세스를 보다 효율적으로 만들려면 가능한 경우 프레젠테이션 시간 순서로 샘플을 전달해야 합니다.
샘플을 전달하기 전에 IWMWriter::BeginWriting을 호출하여 수락하도록 작성기를 설정해야 합니다.
작성기에 샘플을 전달하려면 다음 단계를 수행합니다.
- 버퍼를 할당하고 IWMWriter::AllocateSample을 호출하여 INSSBuffer 인터페이스에 대한 포인터를 검색합니다.
- INSSBuffer::GetBuffer를 호출하여 1단계에서 만든 버퍼의 주소를 검색합니다.
- 샘플 데이터를 버퍼 위치에 복사하여 전달된 샘플이 할당된 버퍼에 맞는지 확인합니다. 메모리 복사 함수를 사용하여 데이터를 복사할 수 있습니다. 일반적인 선택은 표준 C 런타임 라이브러리에 포함된 memcpy입니다.
- INSSBuffer::SetLength를 호출하여 샘플의 실제 크기를 반영하도록 버퍼에 사용되는 데이터 양을 업데이트합니다.
- IWMWriter::WriteSample 메서드를 사용하여 입력 번호 및 샘플 시간과 함께 버퍼 인터페이스를 기록기에 전달합니다. 입력에 대한 모든 오디오 샘플은 동일한 콘텐츠 기간을 나타내므로 샘플 기간을 실행 합계에 추가하여 샘플 시간을 파악할 수 있습니다. 비디오의 경우 프레임 속도에 따라 시간을 계산해야 합니다.
WriteSample 은 비동기적으로 작동하며 애플리케이션이 메서드를 다시 호출할 준비가 되기 전에 버퍼에서 데이터 쓰기를 완료하지 못할 수 있습니다. 따라서 WriteSample을 호출할 때마다 AllocateSample을 한 번 호출하는 것이 중요합니다. 그러나 WriteSample을 호출한 직후 INSSBuffer 인터페이스를 해제할 수 있습니다.
샘플 전달을 마쳤으면 IWMWriter::EndWriting을 호출합니다.
참고 파일의 모든 스트림에서 샘플을 서로 동기화하여 작성기에 전달하는 것이 중요합니다. 즉, 가능하면 IWMWriterAdvanced::SetSyncTolerance에 지정된 동기화 허용 오차 내에서 프레젠테이션 시간 순서로 작성기에 샘플을 전달해야 합니다. 데이터가 1초 이하 단위로 각 스트림에 전달될 때 최상의 결과를 달성합니다.
스트림도 거의 동시에 끝나야 합니다. 예를 들어 45초 길이의 오디오 스트림과 50초 길이의 비디오 스트림이 있는 파일을 작성해서는 안 됩니다. 이러한 파일을 비정형 입력으로 인코딩하면 스트림 끝에 있는 일부 오디오 데이터가 삭제됩니다(짧은 스트림임에도 불구하고). 파일 인코딩이 작동하도록 하려면 한 스트림이 몇 초 전에 끝나지 않도록 오디오 입력에 5초의 무음 을 추가해야 합니다. 텍스트 또는 이미지 스트림과 같은 일시적인 샘플이 있는 스트림 형식이 이러한 방식으로 패딩될 필요는 없습니다. 스크립트 명령 스트림도 이러한 모든 규칙을 따라야 합니다.
관련 항목