미디어 파일 트랜스코딩
동영상 파일을 한 형식에서 다른 형식으로 코드 변환하려면 Windows.Media.Transcoding API를 사용할 수 있습니다.
코드 변환은 동영상 또는 오디오 파일과 같은 디지털 미디어 파일을 한 형식에서 다른 형식으로 변환하는 작업입니다. 이 작업은 일반적으로 파일을 디코드한 후 다시 인코드하여 수행됩니다. 예를 들어 MP4 형식을 지원하는 휴대용 디바이스에서 재생할 수 있도록 Windows Media 파일을 MP4로 변환할 수 있습니다. 또는 HD 동영상 파일을 저해상도로 변환할 수 있습니다. 이 경우 다시 인코딩된 파일은 원본 파일과 동일한 코덱을 사용할 수 있지만 다른 인코딩 프로필을 갖게 됩니다.
코드 변환에 대한 프로젝트 설정
기본 프로젝트 템플릿이 참조하는 네임스페이스 외에도, 이 문서에서 제공되는 코드를 사용하여 미디어 파일의 코드를 변환하려면 이러한 네임스페이스를 참조해야 합니다.
using Windows.Storage;
using Windows.Media.MediaProperties;
using Windows.Media.Transcoding;
원본 파일 및 대상 파일 선택
앱이 코드 변환을 위해 원본 파일 및 대상 파일을 결정하는 방법은 구현에 따라 다릅니다. 이 예제에서는 사용자가 원본 파일 및 대상 파일을 선택할 수 있도록 만들기 위해 FileOpenPicker 및 FileSavePicker를 사용합니다.
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.
}
}