다음을 통해 공유


DirectShow에서 창 미디어 코덱 사용

Windows Media 오디오 및 비디오 인코더 및 디코더 개체는 원래 ASF 파일 컨테이너 형식 및 Windows Media Format SDK를 사용하도록 설계되고 최적화되었습니다. 코덱 개체는 특정 시나리오, 즉 원패스 CBR 및 비디오 스트림의 품질 기반 VBR 인코딩에 대해 DirectShow에서 잘 작동합니다. 그러나 ASF 이외의 파일 컨테이너를 사용하여 DirectShow에서 직접 코덱 개체를 사용하는 것을 고려하는 경우 사전에 알아야 할 특정 동작과 문제가 있습니다.

참고

DirectShow에서 독립 실행형 코덱을 사용하려는 경우 DMO로만 사용하려고 할 것입니다. 즉, IMFTransform 대신 IMediaObject 인터페이스를 사용합니다.

 

AVI 파일의 WM 오디오

DirectShow를 사용하여 WMA 스트림을 멀티플렉서 필터가 있는 파일 컨테이너 형식으로 인코딩할 수 있습니다. 그러나 Windows Media 오디오 및 비디오 코덱 인터페이스는 기본 DirectShow AVI 재생 필터를 사용하여 WMA 스트림이 있는 AVI 파일에서 오디오 비디오 동기화를 유지하는 것은 불가능하기 때문에 AVI 파일에서 WMA를 지원하지 않습니다. 자세한 내용은 압축된 미디어를 AVI 파일에 저장을 참조하세요.

오디오 인코더 DMO는 "일정 비트 전송률" 모드인 경우에도 다양한 기간의 샘플을 출력합니다. 따라서 타임스탬프를 사용하는 파일 컨테이너 형식에서 가장 잘 작동합니다. AVI 파일은 각 오디오 샘플 또는 샘플 그룹에 대한 타임스탬프를 제공하지 않습니다. DirectShow에서 AVI 분할기 필터는 AVI 스트림 헤더의 WAVEFORMATEX 구조체에 있는 nAvgBytesPerSec 값을 기반으로 각 샘플 그룹(각 오디오 프레임)에 대한 타임스탬프를 제조합니다.

이 계산의 근간이 되는 가정은 스트림의 모든 오디오 샘플이 동일한 기간이라는 것입니다. 그러나 DMO의 샘플 출력은 기간이 같지 않으므로 AVI 분할기에서 적용한 타임스탬프는 정확하지 않습니다. 따라서 AVI 분할자 또는 오디오 디코더 DMO를 수정하지 않고는 DirectShow 기반 애플리케이션을 사용하여 오디오 및 비디오 스트림이 동기화된 AVI 파일을 재생할 수 없습니다. Windows Media Audio 9 음성 코덱은 경우에 따라 작동하지만 이 코덱조차도 검색 작업 후에 동기화가 손실되므로 실행 가능한 솔루션으로 간주될 수 없습니다.

MP3 인코더가 있는 경우 오디오 스트림에 대한 WMV 및 MP3를 사용하여 AVI 파일을 만들 수 있습니다. AVI 분할자는 MP3 스트림에 대한 특수 처리 코드를 포함하므로 이러한 파일은 재생되고 Windows 미디어 플레이어 및 기타 DirectShow 기반 애플리케이션에서 올바르게 검색됩니다. 또 다른 옵션은 압축되지 않은 PCM 오디오를 사용하는 것입니다. 단, 결과 파일 크기는 압축된 오디오 스트림보다 훨씬 큽니다. DirectShow 샘플 애플리케이션은 AVI 파일을 만들기 때문에 오디오 인코더 DMO를 사용하는 방법을 보여 주지 않습니다.

원 패스 인코딩

비디오 인코더 DMO는 CBR 및 품질 기반 VBR의 두 가지 인코딩 모드에 대해 DirectShow에서 쉽게 작동합니다. 샘플 애플리케이션에서 설명한 대로 필터 그래프를 빌드할 때 올바른 작업 순서를 따르는 한 AVI 멀티플렉서 및 파일 작성기를 사용하여 WMV 콘텐츠를 AVI 파일에 배치하는 것은 비교적 간단합니다.

투패스 인코딩

2단계 인코딩 모드에서는 두 번째 패스를 시작하기 전에 DMO가 첫 번째 패스에서 콘텐츠를 플러시하지 못하도록 그래프 빌드 및 스트리밍에 대해 보다 복잡한 접근 방식이 필요합니다. 2단계 인코딩에서는 DMO가 파일 데이터의 전처리 분석을 수행한 다음 그래프를 되살릴 수 있도록 그래프를 한 번 실행한 다음, DMO가 실제 인코딩을 수행할 수 있도록 그래프를 다시 실행해야 합니다.

그래프가 두 번째 패스의 실행 상태로 전환되면 타임스탬프가 첫 번째 패스의 마지막 타임스탬프와 순차적이지 않기 때문에 DMO 래퍼는 첫 번째 샘플에서 불연속성 플래그를 설정합니다. 이러한 방식으로 DirectShow에서 작동하도록 설계되지 않은 DMO가 불연속성 플래그를 받으면 플러시를 수행하고 첫 번째 패스에서 저장된 데이터를 잃게 됩니다. 이 문제를 해결하기 위해 가장 좋은 해결 방법은 첫 번째 패스 후에 그래프를 찾을 때 불연속성 플래그를 설정하지 않는 사용자 지정 DMO 래퍼 필터를 작성하는 것입니다. 이 SDK의 VfW(Windows용 비디오) 샘플에서는 2단계 인코딩을 수행하는 방법을 보여 줍니다.

인터레이스된 콘텐츠

WMV 인코더 DMO는 인터레이싱을 유지하면서 인터레이스된 콘텐츠를 인코딩할 수 있습니다. 이는 TV에서 캡처되고 TV에서 재생될 수도 있는 콘텐츠에 유용합니다. 그러나 해당 필터가 입력 샘플 에서 INSSBuffer 를 지원하지 않으므로 기본 DMO 래퍼를 사용하여 인터레이싱을 유지할 수 없습니다.

DMO는 해당 인터페이스를 사용하여 수신하는 각 샘플에 대한 인터레이스 설정을 가져옵니다. DMO 래퍼의 경우처럼 인터페이스를 찾을 수 없는 경우 DMO는 입력 샘플을 비인터레이스로 처리합니다. DirectShow에서 인터레이스 인코딩을 수행하기 위해 몇 가지 대안이 있습니다. 가장 쉬운 방법은 Windows Media Format 9 Series SDK를 직접 사용하거나 WM ASF 기록기 DirectShow 필터를 사용하여 인터레이스된 ASF 파일을 만드는 것입니다. 그런 다음 해당 파일을 다른 형식으로 트랜스코딩할 수 있습니다. AVI로 트랜스코딩하는 경우 인터레이스된 파일이 있지만 표준 DirectShow AVI 재생 필터는 VIDEOINFOHEADER2를 지원하지 않으므로 이를 인식하지 않습니다. 또 다른 방법은 INSSBuffer 인터페이스를 지원하는 고유한 DMO 래퍼 필터를 작성하는 것입니다.

코덱 DMO 작업