Share via


코드 변환 API 사용

이 항목에서는 코드 변환 API를 사용하여 미디어 파일을 인코딩하는 방법을 설명했습니다.

개요

코드 변환 API를 사용하기 전에 애플리케이션에는 다음과 같은 정보가 있어야 합니다.

  • 다시 인코딩할 기존 미디어 파일의 경로 또는 URL입니다.
  • 출력 파일의 이름입니다.
  • 출력 파일의 컨테이너 형식(예: MP4 또는 ASF(고급 스트리밍 형식))입니다.
  • 인코딩 형식입니다. 이 정보에는 인코딩된 오디오 및 비디오 스트림을 설명하는 미디어 유형이 포함됩니다.

코드 변환 API를 사용하기 위해 애플리케이션은 다음 단계를 수행합니다.

  1. 원본 파일을 읽을 미디어 원본을 만듭니다.
  2. 코드 변환 프로필을 만듭니다. 오디오 스트림, 비디오 스트림 및 파일 컨테이너를 설명하는 특성을 추가합니다.
  3. 코드 변환 프로필을 사용하여 인코딩 토폴로지를 만듭니다. 토폴로지에 대한 자세한 내용은 토폴로지 정보를 참조하세요.
  4. 미디어 세션에서 토폴로지를 설정합니다.
  5. 미디어 세션을 시작하고 MESessionEnded 이벤트를 기다립니다.

이 항목의 나머지 부분에서는 이러한 단계를 자세히 설명합니다.

미디어 원본 만들기

미디어 원본은 원본 파일을 읽고 구문 분석하는 개체입니다. 미디어 원본을 만들려면 Source Resolver를 사용합니다. 소스 해결 프로그램 사용 항목에서 예제 코드를 찾을 수 있습니다.

코드 변환 프로필 만들기

코드 변환 프로필은 출력 파일을 인코딩하는 데 사용되는 형식 및 설정을 설명합니다. 코드 변환 프로필에는 다음 세 가지 특성 집합이 포함됩니다.

  • 오디오 특성: 대상 오디오 형식 및 오디오 인코더 설정을 설명합니다.
  • 비디오 특성: 대상 비디오 형식 및 비디오 인코더 설정을 설명합니다.
  • 컨테이너 특성: 파일 컨테이너의 형식과 일부 전역 인코딩 설정을 정의합니다.

코드 변환 프로필을 만들려면 MFCreateTranscodeProfile 함수를 호출합니다. 이 함수는 IMFTranscodeProfile 인터페이스에 대한 포인터를 반환합니다. 초기 프로필 개체가 비어 있습니다. 특성이 없습니다. 다음 단계는 프로필을 정의하는 특성을 추가하는 것입니다.

오디오 특성

오디오 스트림에 대한 특성을 추가하려면 IMFTranscodeProfile::SetAudioAttributes를 호출합니다. 이러한 특성은 오디오 스트림을 인코딩하는 방법을 지정합니다. 출력 파일에 오디오 스트림이 포함되지 않으면 이러한 특성을 생략합니다.

오디오 특성은 다음 두 가지 범주로 구분됩니다.

  • 인코딩된 스트림의 형식을 지정하는 특성
  • 다른 인코딩 매개 변수를 지정하는 특성입니다.

형식 특성은 오디오 미디어 형식 섹션에 설명된 대로 단순히 미디어 형식 특성입니다. 형식 특성의 정확한 집합은 인코더에 따라 달라집니다. ( Media Foundation에서 지원되는 미디어 형식을 참조하세요.) 일반적인 오디오 형식 특성 목록은 다음과 같습니다.

형식 특성 Description
MF_MT_SUBTYPE 하위 형식입니다. 오디오 하위 유형 GUID를 참조하세요.
MF_MT_AUDIO_NUM_CHANNELS 오디오 채널의 수입니다.
MF_MT_AUDIO_SAMPLES_PER_SECOND 초당 오디오 샘플 수입니다.
MF_MT_AUDIO_BLOCK_ALIGNMENT 블록 맞춤입니다.
MF_MT_AUDIO_AVG_BYTES_PER_SECOND 초당 평균 바이트 수(인코딩된 비트 속도)입니다.

 

다음 인코딩 매개 변수가 정의됩니다.

인코딩 매개 변수 설명
MF_TRANSCODE_DONOT_INSERT_ENCODER 코드 변환 API가 오디오 스트림에 대한 인코더를 삽입하지 못하도록 합니다.
MF_TRANSCODE_ENCODINGPROFILE 디바이스 규칙 템플릿을 지정합니다. (ASF 파일에만 적용됩니다.)
MF_TRANSCODE_QUALITYVSSPEED 인코딩 품질과 속도 간의 절차를 지정합니다.

 

형식 특성을 설정해야 합니다. 인코딩 매개 변수는 선택 사항입니다.

인코더와 호환되는 형식을 찾는 한 가지 방법은 MFTranscodeGetAudioOutputAvailableTypes 함수를 호출하는 것입니다. 원하는 인코더는 하위 유형으로 지정됩니다. 함수는 해당 인코더에 대한 미디어 형식의 컬렉션을 반환합니다. 목록에서 형식을 선택하고 특성을 프로필에 복사할 수 있습니다. 이 방법을 사용하는 예제 코드는 자습서: WMA 파일 인코딩을 참조하세요.

비디오 특성

비디오 스트림에 대한 특성을 추가하려면 IMFTranscodeProfile::SetVideoAttributes를 호출합니다. 이러한 특성은 비디오 스트림을 인코딩하는 방법을 지정합니다. 출력 파일에 비디오 스트림이 포함되지 않은 경우 이러한 특성을 생략합니다.

오디오 특성과 마찬가지로 비디오 특성은 다음 두 가지 범주로 구분됩니다.

  • 인코딩된 스트림의 형식을 지정하는 특성
  • 다른 인코딩 매개 변수를 지정하는 특성입니다.

형식 특성은 비디오 미디어 형식 섹션에 설명된 대로 미디어 형식 특성입니다. 일반적인 비디오 형식 특성 목록은 다음과 같습니다.

형식 특성 Description
MF_MT_SUBTYPE 하위 형식입니다. 비디오 하위 형식 GUID를 참조하세요.
MF_MT_FRAME_RATE 프레임 속도입니다.
MF_MT_FRAME_SIZE 프레임 크기입니다.
MF_MT_AVG_BITRATE 평균 비트 속도입니다.
MF_MT_PIXEL_ASPECT_RATIO 픽셀 가로 세로 비율입니다.

 

다음 인코딩 매개 변수가 정의됩니다.

인코딩 매개 변수 설명
MF_TRANSCODE_DONOT_INSERT_ENCODER 코드 변환 API가 비디오 스트림에 대한 인코더를 삽입하지 못하도록 합니다.
MF_TRANSCODE_ENCODINGPROFILE 디바이스 규칙 템플릿을 지정합니다. (ASF 파일에만 적용됩니다.)
MF_TRANSCODE_QUALITYVSSPEED 인코딩 품질과 속도 간의 절전 모드를 지정합니다.

 

형식 특성을 설정해야 합니다. 인코딩 매개 변수는 선택 사항입니다.

컨테이너 특성

컨테이너 특성은 출력 파일의 파일 수준 특성을 정의합니다. 컨테이너 특성을 설정하려면 IMFTranscodeProfile::SetContainerAttributes를 호출합니다. 다음 특성이 정의됩니다.

attribute Description
MF_TRANSCODE_ADJUST_PROFILE 트랜스코드 토폴로지에 사용할 스트림 설정을 정의합니다. 입력 원본 설정을 사용하거나 사용자 지정 스트림 특성을 사용하도록 플래그를 설정할 수 있습니다.
MF_TRANSCODE_CONTAINERTYPE 출력 파일의 파일 형식(예: MP4 또는 ASF)을 지정합니다. 이 값에 따라 적절한 미디어 싱크가 토폴로지에 추가됩니다.
MF_TRANSCODE_SKIP_METADATA_TRANSFER 원본의 메타데이터를 출력 파일에 복사할지 여부를 지정합니다.
MF_TRANSCODE_TOPOLOGYMODE 코드 변환 중에 하드웨어 기반 코덱을 사용할 수 있는지 여부를 지정합니다.
MFT_FIELDOFUSE_UNLOCK_Attribute 사용 필드 제한이 있는 코덱의 잠금을 해제합니다. 자세한 내용은 사용 제한 필드를 참조하세요.

 

MF_TRANSCODE_CONTAINERTYPE 특성이 필요합니다. 다른 컨테이너 특성은 선택 사항입니다.

트랜스코드 토폴로지 만들기

트랜스코드 토폴로지는 미디어 원본, 적절한 코덱 및 미디어 싱크를 포함하는 부분 토폴로지입니다. 트랜스코드 토폴로지를 만들려면 MFCreateTranscodeTopology 함수를 호출합니다 . 이 함수는 다음 매개 변수를 입력으로 사용합니다.

  • 미디어 원본의 IMFMediaSource 인터페이스에 대한 포인터입니다.
  • 출력 파일의 이름입니다.
  • 트랜스코드 프로필의 IMFTranscodeProfile 인터페이스에 대한 포인터입니다.

함수는 IMFTopology 인터페이스에 대한 포인터를 반환합니다.

인코딩 세션 실행

토폴로지를 만든 후에는 파일을 인코딩할 준비가 된 것입니다. 이 시점에서 프로필을 삭제할 수 있습니다.

  1. MFCreateMediaSession을 호출하여 미디어 세션을 만듭니다.
  2. IMFMediaSession::SetTopology를 호출하여 미디어 세션에서 토폴로지를 설정합니다.
  3. IMFMediaSession::Start를 호출하여 인코딩 세션을 시작합니다.
  4. MESessionEnded 이벤트를 기다립니다.
  5. IMFMediaSession::Close를 호출하여 미디어 세션을 닫습니다.
  6. MESessionClosed 이벤트를 기다립니다.
  7. IMFMediaSource::Shutdown을 호출합니다.
  8. IMFMediaSession::Shutdown을 호출합니다.

인코딩에 소요된 대부분의 시간은 3단계와 4단계 사이에 발생합니다.

API 코드 변환

미디어 세션 정보