미디어 파일 트랜스코딩

Windows.Media.Transcoding API를 사용하여 비디오 파일을 한 형식에서 다른 형식으로 트랜스코딩할 수 있습니다.

코드 변환 은 비디오 또는 오디오 파일과 같은 디지털 미디어 파일을 한 형식에서 다른 형식으로 변환하는 것입니다. 이 작업은 일반적으로 파일을 디코딩한 다음 다시 인코딩하여 수행됩니다. 예를 들어 mp4 형식을 지원하는 이식 가능한 장치에서 재생할 수 있도록 Windows Media 파일을 MP4로 변환할 수 있습니다. 또는 고화질 비디오 파일을 더 낮은 해상도로 변환할 수 있습니다. 이 경우 다시 인코딩된 파일은 원래 파일과 동일한 코덱을 사용할 수 있지만 인코딩 프로필은 다릅니다.

원본 및 대상 파일 선택

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

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

// Initialize the picker with the window handle (required for WinUI desktop apps).
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
WinRT.Interop.InitializeWithWindow.Initialize(openPicker, hwnd);

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();

WinRT.Interop.InitializeWithWindow.Initialize(savePicker, hwnd);

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 Profile
CreateAlac Apple ALAC(무손실 오디오 코덱) 오디오
CreateFlac FLAC(무료 무손실 오디오 코덱) 오디오
CreateM4a AAC 오디오(M4A)
CreateMp3 MP3 오디오
CreateWav WAV 오디오
CreateWma Windows 미디어 오디오 (WMA)

오디오/비디오 인코딩 프로필을 만드는 방법

Method Profile
CreateAv1 AOMedia Video 1 (AV1) 동영상
CreateAvi AVI
CreateHevc H.265 비디오라고도 하는 HEVC(고효율 비디오 코딩) 비디오
CreateMp4 MP4 비디오(H.264 비디오 및 AAC 오디오)
CreateVp9 VP9 비디오
CreateWmv Windows 미디어 비디오(WMV)

다음 코드는 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 의 진행률이 변경되면 응답하도록 이벤트를 등록할 수 있습니다. 이러한 이벤트는 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.
    }
}