다음을 통해 공유


미디어 파일 트랜스코딩

동영상 파일을 한 형식에서 다른 형식으로 코드 변환하려면 Windows.Media.Transcoding API를 사용할 수 있습니다.

코드 변환은 동영상 또는 오디오 파일과 같은 디지털 미디어 파일을 한 형식에서 다른 형식으로 변환하는 작업입니다. 이 작업은 일반적으로 파일을 디코드한 후 다시 인코드하여 수행됩니다. 예를 들어 MP4 형식을 지원하는 휴대용 디바이스에서 재생할 수 있도록 Windows Media 파일을 MP4로 변환할 수 있습니다. 또는 HD 동영상 파일을 저해상도로 변환할 수 있습니다. 이 경우 다시 인코딩된 파일은 원본 파일과 동일한 코덱을 사용할 수 있지만 다른 인코딩 프로필을 갖게 됩니다.

코드 변환에 대한 프로젝트 설정

기본 프로젝트 템플릿이 참조하는 네임스페이스 외에도, 이 문서에서 제공되는 코드를 사용하여 미디어 파일의 코드를 변환하려면 이러한 네임스페이스를 참조해야 합니다.

using Windows.Storage;
using Windows.Media.MediaProperties;
using Windows.Media.Transcoding;

원본 파일 및 대상 파일 선택

앱이 코드 변환을 위해 원본 파일 및 대상 파일을 결정하는 방법은 구현에 따라 다릅니다. 이 예제에서는 사용자가 원본 파일 및 대상 파일을 선택할 수 있도록 만들기 위해 FileOpenPickerFileSavePicker를 사용합니다.

var openPicker = new Windows.Storage.Pickers.FileOpenPicker();

openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
openPicker.FileTypeFilter.Add(".wmv");
openPicker.FileTypeFilter.Add(".mp4");

StorageFile source = await openPicker.PickSingleFileAsync();

var savePicker = new Windows.Storage.Pickers.FileSavePicker();

savePicker.SuggestedStartLocation =
    Windows.Storage.Pickers.PickerLocationId.VideosLibrary;

savePicker.DefaultFileExtension = ".mp4";
savePicker.SuggestedFileName = "New Video";

savePicker.FileTypeChoices.Add("MPEG4", new string[] { ".mp4" });

StorageFile destination = await savePicker.PickSaveFileAsync();

미디어 인코딩 프로필 만들기

인코딩 프로필에는 대상 파일의 인코드 방법을 결정하는 설정이 포함되어 있습니다. 파일을 코드 변환하는 경우 여기서 가장 많은 옵션을 사용할 수 있습니다.

MediaEncodingProfile 클래스는 미리 정의된 인코딩 프로필을 만들기 위한 정적 메서드를 제공합니다.

오디오 전용 인코딩 프로필을 만들기 위한 메서드

Method 프로필
CreateAlac ALAC(Apple 무손실 오디오 코덱) 오디오
CreateFlac FLAC(무료 무손실 오디오 코덱) 오디오.
CreateM4a AAC 오디오(M4A)
CreateMp3 MP3 오디오
CreateWav WAV 오디오
CreateWmv Windows Media Audio (WMA)

오디오/비디오 인코딩 프로필을 만들기 위한 메서드

Method 프로필
CreateAvi AVI
CreateHevc HEVC(고효율성 비디오 코딩) 비디오, H.265 비디오라고도 함
CreateMp4 MP4 비디오(H.264 비디오 및 AAC 오디오)
CreateWmv WMV(Windows Media Video)

다음 코드는 MP4 동영상용 프로필을 만듭니다.

MediaEncodingProfile profile =
    MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

정적 CreateMp4 메서드는 MP4 인코딩 프로필을 만듭니다. 이 메서드의 매개 변수는 동영상의 대상 해상도를 제공합니다. 이 경우 VideoEncodingQuality.hd720p는 초당 30 프레임 속도에서 1280 x 720 픽셀을 의미합니다. “720p”는 프레임당 프로그레시브 스캔 라인 720을 나타냅니다. 미리 정의된 프로필을 만드는 다른 방법은 모두 이 패턴을 따릅니다.

또는 MediaEncodingProfile.CreateFromFileAsync 메서드를 사용하여 기존 미디어 파일과 일치하는 프로필을 만들 수 있습니다. 또는 원하는 인코딩 설정을 정확하게 알고 있는 경우 새 MediaEncodingProfile 개체를 만들고 프로필 세부 정보를 채울 수 있습니다.

파일 코드 변환

파일을 트랜스코딩하려면 새 MediaTranscoder 개체를 만들고 MediaTranscoder.PrepareFileTranscodeAsync 메서드를 호출합니다. 원본 파일, 대상 파일 및 인코딩 프로필을 전달합니다. 그런 다음 비동기 코드 변환 작업에서 반환된 PrepareTranscodeResult 개체의 TranscodeAsync 메서드를 호출합니다.

MediaTranscoder transcoder = new MediaTranscoder();

PrepareTranscodeResult prepareOp = await
    transcoder.PrepareFileTranscodeAsync(source, destination, profile);

if (prepareOp.CanTranscode)
{
    var transcodeOp = prepareOp.TranscodeAsync();

    transcodeOp.Progress +=
        new AsyncActionProgressHandler<double>(TranscodeProgress);
    transcodeOp.Completed +=
        new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
}
else
{
    switch (prepareOp.FailureReason)
    {
        case TranscodeFailureReason.CodecNotFound:
            System.Diagnostics.Debug.WriteLine("Codec not found.");
            break;
        case TranscodeFailureReason.InvalidProfile:
            System.Diagnostics.Debug.WriteLine("Invalid profile.");
            break;
        default:
            System.Diagnostics.Debug.WriteLine("Unknown failure.");
            break;
    }
}

코드 변환 진행률에 응답

비동기 TranscodeAsync의 진행이 변경되면 응답하도록 이벤트를 등록할 수 있습니다. 이러한 이벤트는 UWP(유니버설 Windows 플랫폼) 앱에 대한 비동기 프로그래밍 프레임워크의 일부이며 코드 변환 API와 관련이 없습니다.

void TranscodeProgress(IAsyncActionWithProgress<double> asyncInfo, double percent)
{
    // Display or handle progress info.
}

void TranscodeComplete(IAsyncActionWithProgress<double> asyncInfo, AsyncStatus status)
{
    asyncInfo.GetResults();
    if (asyncInfo.Status == AsyncStatus.Completed)
    {
        // Display or handle complete info.
    }
    else if (asyncInfo.Status == AsyncStatus.Canceled)
    {
        // Display or handle cancel info.
    }
    else
    {
        // Display or handle error info.
    }
}