데이터 압축을 풀지 않고 스트림 복사
한 파일에서 다른 파일로 스트림을 복사하는 가장 간단하고 일반적인 방법은 압축된 상태에서 샘플을 검색한 다음 압축을 풀고 압축을 풀지 않고 새 파일에 쓰는 것입니다. 압축된 상태의 파일에서 가져온 샘플을 스트림의 표현에서 변환되지 않으므로 스트림 샘플이라고 합니다. 디지털 미디어 데이터의 압축을 풀고 다시 압축하면 품질이 저하되므로 스트림 샘플을 사용하여 스트림을 복사하는 것이 좋습니다. 압축 해제된 데이터에서 스트림을 복사해야 하는 경우 압축 해제 된 샘플을 사용하여 스트림 복사를 참조하세요.
압축된 샘플을 사용하여 둘 이상의 스트림을 단일 스트림에 연결할 수 있지만 비트 속도가 동일한 경우에만 가능합니다. 프로세스는 기본적으로 아래 설명된 단계와 동일합니다. 단, 필요한 모든 콘텐츠를 얻으려면 여러 원본 파일을 읽어야 합니다. 그러나 압축된 모든 스트림의 WM_MEDIA_TYPE 구조체(모든 pbFormat 구조체 멤버 포함)가 동일한 경우에만 여러 파일에서 단일 스트림으로 압축된 샘플을 작성할 수 있습니다. 형식이 같지 않은 여러 스트림의 데이터를 결합하려면 콘텐츠를 압축 해제하고 대상 스트림으로 다시 압축해야 합니다. 또한 두 개 이상의 스트림의 데이터를 단일 스트림으로 결합하는 경우 모든 스트림에 대한 버퍼 창 값을 함께 추가하여 새 스트림에 대한 버퍼 창을 가져와야 합니다. 이는 한 스트림의 끝과 다른 스트림의 시작 부분에서 얼마나 많은 버퍼가 차지되는지 확인할 수 없기 때문입니다.
IWMReaderAdvanced::SetReceiveStreamSamples를 사용하여 비동기 판독기로 스트림 샘플을 검색할 수 있습니다. 스트림 샘플은 IWMReaderCallback::OnSample이 아닌 IWMReaderCallbackAdvanced::OnStreamSample에 전달됩니다. 파일을 읽고 압축된 일부 스트림과 압축 해제된 스트림을 검색하는 경우 두 콜백 메서드를 모두 구현해야 합니다.
동기 판독기는 샘플을 보다 유연하게 검색할 수 있습니다. IWMSyncReader::SetReadStreamSamples를 사용하여 재생 중에 압축된 샘플과 압축 해제된 샘플 간에 자유롭게 전환할 수 있습니다.
하나의 ASF 파일에서 새 ASF 파일로 전체 스트림을 복사하려면 다음 단계를 수행합니다. 이러한 단계는 이러한 종류의 작업에 사용하는 것이 훨씬 더 간단하기 때문에 동기 판독기를 사용합니다.
- WMCreateSyncReader 함수를 호출하여 동기 판독기 개체를 만듭니다.
- IWMSyncReader::Open을 호출하여 판독기에서 파일을 엽니다.
- IWMSyncReader::QueryInterface를 호출하여 동기 판독기 개체의 IWMProfile 인터페이스에 대한 포인터를 가져옵니다.
- IWMProfile::GetStreamByNumber를 호출하여 원하는 스트림의 속성을 검색합니다. 그러면 원하는 스트림에 대한 스트림 구성 개체의 IWMStreamConfig 인터페이스에 대한 포인터가 검색됩니다.
- 스트림에 대한 WM_MEDIA_TYPE 구조체의 복사본을 가져옵니다. IWMMediaProps::GetMediaType을 두 차례 호출합니다. 구조체의 크기를 가져오는 첫 번째 호출, 구조체 자체를 가져오는 두 번째 호출입니다.
- WMCreateProfileManager 함수를 호출하여 프로필 관리자 개체를 만듭니다.
- IWMProfileManager::CreateEmptyProfile을 호출하여 새 프로필을 만들거나 스트림을 추가할 기존 프로필을 엽니다. 새 프로필에서 IWMProfile::AddStream 을 호출하여 기존 파일에서 스트림을 추가합니다. 스트림을 추가할 때 4단계에서 가져온 IWMStreamConfig 포인터를 사용합니다.
- WMCreateWriter 함수를 호출하여 기록기 개체를 만듭니다. IWMWriter::SetProfile을 호출하여 새로 만든 프로필을 작성기에서 활성 프로필로 설정합니다. IWMWriter::SetOutputFilename을 호출하여 출력할 파일을 만듭니다.
- 복사하는 스트림 또는 스트림과 연결된 각 입력에 대해 IWMWriter::SetInputProps를 호출하고 IWMInputMediaProps 인터페이스에 대해 NULL을 전달합니다. 그러면 전달 중인 데이터의 유효성을 검사할 필요가 없다는 것을 기록기 개체에 알릴 수 있습니다. BeginWriting(14단계)을 호출하기 전에 이 호출을 수행해야 합니다. 그렇지 않으면 읽기 개체가 콘텐츠를 디코딩하지 못할 수 있습니다.
- fCompressed 매개 변수가 True로 설정된 IWMSyncReader::SetReadStreamSamples를 호출하여 선택한 스트림에 대해 압축된 스트림 샘플을 제공하도록 동기 판독기를 설정합니다.
- 복사되는 모든 스트림에 대한 코덱 정보를 가져오고 작성하기 전에 헤더에 코덱 정보를 추가합니다. 코덱 정보를 가져오려면 IWMHeaderInfo2::GetCodecInfoCount 및 IWMHeaderInfo2::GetCodecInfo 를 호출하여 판독기에서 파일과 연결된 코덱을 열거합니다. 스트림 구성과 일치하는 코덱 정보를 선택합니다. 그런 다음 IWMHeaderInfo3::AddCodecInfo를 호출하고 판독기에서 얻은 정보를 전달하여 작성기에서 코덱 정보를 설정합니다.
- IWMWriter::QueryInterface를 호출하여 IWMWriterAdvanced 인터페이스에 대한 포인터를 가져옵니다.
- IWMWriter::BeginWriting을 호출하여 작성기를 쓰기 모드로 설정합니다.
- 원하는 스트림 번호를 지정하여 IWMSyncReader::GetNextSample을 반복해서 호출합니다. 샘플이 수신되면 IWMWriterAdvanced::WriteStreamSample에 대한 호출을 사용하여 작성기에 전달합니다. 비디오 스트림의 경우 GetNextSample에 대한 각 호출에서 기록기가 설정한 플래그(있는 경우)를 검사 합니다. WM_SF_CLEANPOINT 설정된 경우 WriteStreamSample 호출에서도 설정해야 합니다.
- 읽기가 완료되면 IWMWriter::EndWriting을 호출합니다. 스트림을 전송해야 합니다.
참고
스트림 샘플을 사용하여 한 파일에서 다른 파일로 이미지 스트림을 복사할 수 없습니다. 이미지 스트림 데이터를 복사하려면 압축되지 않은 샘플을 검색한 다음, 평소처럼 작성기를 통해 처리합니다.
관련 항목