미디어 컴퍼지션 및 편집Media compositions and editing

이 문서에서는 Windows 의 api를 사용 하 여 사용자가 오디오 및 비디오 원본 파일에서 미디어 컴퍼지션을 만들 수 있도록 하는 앱을 신속 하 게 개발 하는 방법을 보여 줍니다.This article shows you how to use the APIs in the Windows.Media.Editing namespace to quickly develop apps that enable the users to create media compositions from audio and video source files. 프레임 워크의 기능에는 프로그래밍 방식으로 여러 비디오 클립을 추가 하 고, 비디오 및 이미지 오버레이를 추가 하 고, 배경 오디오를 추가 하 고, 오디오 및 비디오 효과를 적용 하는 기능이 포함 됩니다.Features of the framework include the ability to programmatically append multiple video clips together, add video and image overlays, add background audio, and apply both audio and video effects. 미디어 컴퍼지션을 만든 후에는 재생 또는 공유를 위해 플랫 미디어 파일로 렌더링할 수 있지만, 컴퍼지션을 디스크에서 serialize 및 deserialize 할 수 있으므로 사용자가 이전에 만든 컴퍼지션을 로드 하 고 수정할 수 있습니다.Once created, media compositions can be rendered into a flat media file for playback or sharing, but compositions can also be serialized to and deserialized from disk, allowing the user to load and modify compositions that they have previously created. 이 기능은 모두 사용 하기 쉬운 Windows 런타임 인터페이스로 제공 되므로 하위 수준 Microsoft 미디어 파운데이션 API와 비교할 때 이러한 작업을 수행 하는 데 필요한 코드의 양과 복잡성을 대폭 줄일 수 있습니다.All of this functionality is provided in an easy-to-use Windows Runtime interface that dramatically reduces the amount and complexity of code required to perform these tasks when compared to the low-level Microsoft Media Foundation API.

새 미디어 컴퍼지션 만들기Create a new media composition

Mediacomposition 클래스는 컴퍼지션을 구성 하는 모든 미디어 클립의 컨테이너 이며 최종 컴퍼지션을 렌더링 하 고, 디스크에 컴퍼지션을 로드 및 저장 하 고, 사용자가 UI에서 볼 수 있도록 컴포지션의 미리 보기 스트림을 제공 합니다.The MediaComposition class is the container for all of the media clips that make up the composition and is responsible for rendering the final composition, loading and saving compositions to disc, and providing a preview stream of the composition so that the user can view it in the UI. 앱에서 Mediacomposition 을 사용 하려면 필요에 따라 관련 api를 제공 하는 windows . media. 네임 스페이스와 windows 네임 스페이스를 포함 합니다.To use MediaComposition in your app, include the Windows.Media.Editing namespace as well as the Windows.Media.Core namespace that provides related APIs that you will need.

using Windows.Media.Editing;
using Windows.Media.Core;
using Windows.Media.Playback;
using System.Threading.Tasks;

Mediacomposition 개체는 코드의 여러 지점에서 액세스할 수 있으므로 일반적으로이 개체를 저장할 멤버 변수를 선언 합니다.The MediaComposition object will be accessed from multiple points in your code, so typically you will declare a member variable in which to store it.

private MediaComposition composition;

Mediacomposition 의 생성자는 인수를 사용 하지 않습니다.The constructor for MediaComposition takes no arguments.

composition = new MediaComposition();

컴포지션에 미디어 클립 추가Add media clips to a composition

미디어 컴포지션에는 일반적으로 하나 이상의 비디오 클립이 포함 됩니다.Media compositions typically contain one or more video clips. Fileopenpicker 를 사용 하 여 사용자가 비디오 파일을 선택할 수 있습니다.You can use a FileOpenPicker to allow the user to select a video file. 파일이 선택 되 면 Mediaclip를 호출 하 여 비디오 클립을 포함 하는 새 mediaclip 개체를 만듭니다.Once the file has been selected, create a new MediaClip object to contain the video clip by calling MediaClip.CreateFromFileAsync. 그런 다음 클립을 Mediacomposition 개체의 클립 목록에 추가 합니다.Then you add the clip to the MediaComposition object's Clips list.

private async Task PickFileAndAddClip()
{
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
    picker.FileTypeFilter.Add(".mp4");
    Windows.Storage.StorageFile pickedFile = await picker.PickSingleFileAsync();
    if (pickedFile == null)
    {
        ShowErrorMessage("File picking cancelled");
        return;
    }

    // These files could be picked from a location that we won't have access to later
    var storageItemAccessList = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList;
    storageItemAccessList.Add(pickedFile);

    var clip = await MediaClip.CreateFromFileAsync(pickedFile);
    composition.Clips.Add(clip);

}
  • 미디어 클립은 클립 목록에 표시 되는 것과 동일한 순서로 Mediacomposition 에 표시 됩니다.Media clips appear in the MediaComposition in the same order as they appear in Clips list.

  • Mediaclip 는 한 번에 하나의 컴포지션에만 포함할 수 있습니다.A MediaClip can only be included in a composition once. 이미 컴퍼지션에서 사용 중인 Mediaclip 를 추가 하려고 하면 오류가 발생 합니다.Attempting to add a MediaClip that is already being used by the composition will result in an error. 컴포지션에서 비디오 클립을 여러 번 다시 사용 하려면 Clone 을 호출 하 여 새 mediaclip 개체를 만든 다음이 개체를 컴퍼지션에 추가할 수 있습니다.To reuse a video clip multiple times in a composition, call Clone to create new MediaClip objects which can then be added to the composition.

  • 유니버설 Windows 앱은 전체 파일 시스템에 액세스할 수 있는 권한이 없습니다.Universal Windows apps do not have permission to access the entire file system. Storageapplicationpermissions 클래스의 FutureAccessList 속성을 사용 하면 응용 프로그램에서 사용자가 선택한 파일의 레코드를 저장 하 여 파일에 대 한 액세스 권한을 유지할 수 있습니다.The FutureAccessList property of the StorageApplicationPermissions class allows your app to store a record of a file that has been selected by the user so that you can retain permissions to access the file. FutureAccessList 에는 최대 기간의 1000 항목이 있으므로 앱이 꽉 찰 수 없도록 목록을 관리 해야 합니다.The FutureAccessList has a maxium of 1000 entries, so your app needs to manage the list to make sure it does not become full. 이전에 만든 컴포지션을 로드 하 고 수정 하는 것을 지원 하려는 경우에 특히 중요 합니다.This is especially important if you plan to support loading and modifying previously created compositions.

  • Mediacomposition 은 MP4 형식의 비디오 클립을 지원 합니다.A MediaComposition supports video clips in MP4 format.

  • 비디오 파일에 포함 된 오디오 트랙이 여러 개 있는 경우 SelectedEmbeddedAudioTrackIndex 속성을 설정 하 여 컴포지션에서 사용 되는 오디오 트랙을 선택할 수 있습니다.If a video file contains multiple embedded audio tracks, you can select which audio track is used in the composition by setting the SelectedEmbeddedAudioTrackIndex property.

  • Createfromcolor 를 호출 하 고 클립에 대 한 색과 기간을 지정 하 여 전체 프레임을 채우는 단일 색을 사용 하 여 mediaclip 를 만듭니다.Create a MediaClip with a single color filling the entire frame by calling CreateFromColor and specifying a color and a duration for the clip.

  • CreateFromImageFileAsync 를 호출 하 고 이미지 파일 및 클립 기간을 지정 하 여 이미지 파일에서 mediaclip 를 만듭니다.Create a MediaClip from an image file by calling CreateFromImageFileAsync and specifying an image file and a duration for the clip.

  • Createfromsurface 를 호출 하 고 클립에서 서피스와 기간을 지정 하 여 IDirect3DSurface 에서 mediaclip 를 만듭니다.Create a MediaClip from a IDirect3DSurface by calling CreateFromSurface and specifying a surface and a duration from the clip.

MediaElement에서 컴퍼지션을 미리 봅니다.Preview the composition in a MediaElement

사용자가 미디어 컴퍼지션을 볼 수 있도록 하려면 UI를 정의 하는 XAML 파일에 MediaPlayerElement 를 추가 합니다.To enable the user to view the media composition, add a MediaPlayerElement to the XAML file that defines your UI.

<MediaPlayerElement x:Name="mediaPlayerElement" AutoPlay="False" Margin="5" HorizontalAlignment="Stretch" AreTransportControlsEnabled="True" />

Mediastreamsource형식의 멤버 변수를 선언 합니다.Declare a member variable of type MediaStreamSource.

private MediaStreamSource mediaStreamSource;

Mediacomposition 개체의 GeneratePreviewMediaStreamSource 메서드를 호출 하 여 컴포지션의 mediastreamsource 를 만듭니다.Call the MediaComposition object's GeneratePreviewMediaStreamSource method to create a MediaStreamSource for the composition. 팩터리 메서드 Createfrommediastreamsource 를 호출 하 여 MediaSource 개체를 만들고 MediaPlayerElementSource 속성에 할당 합니다.Create a MediaSource object by calling the factory method CreateFromMediaStreamSource and assign it to the Source property of the MediaPlayerElement. 이제 UI에서 컴퍼지션을 볼 수 있습니다.Now the composition can be viewed in the UI.

public void UpdateMediaElementSource()
{

    mediaStreamSource = composition.GeneratePreviewMediaStreamSource(
        (int)mediaPlayerElement.ActualWidth,
        (int)mediaPlayerElement.ActualHeight);

    mediaPlayerElement.Source = MediaSource.CreateFromMediaStreamSource(mediaStreamSource);

}
  • MediacompositionGeneratePreviewMediaStreamSource를 호출 하기 전에 미디어 클립을 하나 이상 포함 해야 합니다. 그렇지 않으면 반환 된 개체가 null이 됩니다.The MediaComposition must contain at least one media clip before calling GeneratePreviewMediaStreamSource, or the returned object will be null.

  • MediaElement 타임 라인은 컴퍼지션의 변경 내용을 반영 하도록 자동으로 업데이트 되지 않습니다.The MediaElement timeline is not automatically updated to reflect changes in the composition. 컴퍼지션에 일련의 변경을 수행하여 UI를 업데이트하려는 경우에는 그때마다 GeneratePreviewMediaStreamSource를 호출하고 MediaPlayerElement 소스 속성을 호출하는 것이 좋습니다.It is recommended that you call both GeneratePreviewMediaStreamSource and set the MediaPlayerElement Source property every time you make a set of changes to the composition and want to update the UI.

사용자가 연결 된 리소스를 해제 하기 위해 페이지에서 벗어날 때 Mediastreamsource 개체와 MediaPlayerElementsource 속성을 null로 설정 하는 것이 좋습니다.It is recommended that you set the MediaStreamSource object and the Source property of the MediaPlayerElement to null when the user navigates away from the page in order to release associated resources.

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    mediaPlayerElement.Source = null;
    mediaStreamSource = null;
    base.OnNavigatedFrom(e);

}

비디오 파일에 컴퍼지션 렌더링Render the composition to a video file

미디어 컴퍼지션을 다른 장치에서 공유 하 고 볼 수 있도록 미디어 컴퍼지션을 플랫 비디오 파일에 렌더링 하려면 Windows. d a. 트랜스 코딩 네임 스페이스에서 api를 사용 해야 합니다.To render a media composition to a flat video file so that it can be shared and viewed on other devices, you will need to use APIs from the Windows.Media.Transcoding namespace. 비동기 작업의 진행률에 대 한 UI를 업데이트 하려면 Windows 네임 스페이스의 api도 필요 합니다.To update the UI on the progress of the async operation, you will also need APIs from the Windows.UI.Core namespace.

using Windows.Media.Transcoding;
using Windows.UI.Core;

사용자가 FileSavePicker를 사용 하 여 출력 파일을 선택할 수 있게 한 후에는 Mediacomposition 개체의 RenderToFileAsync를 호출 하 여 컴퍼지션을 선택 된 파일로 렌더링 합니다.After allowing the user to select an output file with a FileSavePicker, render the composition to the selected file by calling the MediaComposition object's RenderToFileAsync. 다음 예제의 나머지 코드는 단순히 AsyncOperationWithProgress를 처리 하는 패턴을 따릅니다.The rest of the code in the following example simply follows the pattern of handling an AsyncOperationWithProgress.

private async Task RenderCompositionToFile()
{
    var picker = new Windows.Storage.Pickers.FileSavePicker();
    picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
    picker.FileTypeChoices.Add("MP4 files", new List<string>() { ".mp4" });
    picker.SuggestedFileName = "RenderedComposition.mp4";

    Windows.Storage.StorageFile file = await picker.PickSaveFileAsync();
    if (file != null)
    {
        // Call RenderToFileAsync
        var saveOperation = composition.RenderToFileAsync(file, MediaTrimmingPreference.Precise);

        saveOperation.Progress = new AsyncOperationProgressHandler<TranscodeFailureReason, double>(async (info, progress) =>
        {
            await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
            {
                ShowErrorMessage(string.Format("Saving file... Progress: {0:F0}%", progress));
            }));
        });
        saveOperation.Completed = new AsyncOperationWithProgressCompletedHandler<TranscodeFailureReason, double>(async (info, status) =>
        {
            await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
            {
                try
                {
                    var results = info.GetResults();
                    if (results != TranscodeFailureReason.None || status != AsyncStatus.Completed)
                    {
                        ShowErrorMessage("Saving was unsuccessful");
                    }
                    else
                    {
                        ShowErrorMessage("Trimmed clip saved to file");
                    }
                }
                finally
                {
                        // Update UI whether the operation succeeded or not
                    }

            }));
        });
    }
    else
    {
        ShowErrorMessage("User cancelled the file selection");
    }
}
  • MediaTrimmingPreference 를 사용 하면 트랜스 코딩 작업의 속도와 인접 한 미디어 클립의 트리밍 전체 자릿수를 우선 순위를 정할 수 있습니다.The MediaTrimmingPreference allows you to prioritize speed of the transcoding operation versus the precision of trimming of adjacent media clips. 빠른 코드 변환이 낮은 정밀도 트리밍을 사용 하 여 더 빠르게 작동 하 고, 정확 하 게 트랜스 코딩 속도가 느려지고, 보다 정확한 트리밍을 사용 합니다.Fast causes transcoding to be faster with lower-precision trimming, Precise causes transcoding to be slower but with more precise trimming.

비디오 클립 자르기Trim a video clip

Mediaclip 개체 TrimTimeFromStart 속성, TrimTimeFromEnd 속성 또는 둘 다를 설정 하 여 컴포지션의 비디오 클립 기간을 자릅니다.Trim the duration of a video clip in a composition by setting the MediaClip objects TrimTimeFromStart property, the TrimTimeFromEnd property, or both.

private void TrimClipBeforeCurrentPosition()
{
    var currentClip = composition.Clips.FirstOrDefault(
        mc => mc.StartTimeInComposition <= mediaPlayerElement.MediaPlayer.PlaybackSession.Position &&
        mc.EndTimeInComposition >= mediaPlayerElement.MediaPlayer.PlaybackSession.Position);

    TimeSpan positionFromStart = mediaPlayerElement.MediaPlayer.PlaybackSession.Position - currentClip.StartTimeInComposition;
    currentClip.TrimTimeFromStart = positionFromStart;

}
  • 사용자가 시작 및 종료 트리밍 값을 지정할 수 있도록 하려는 모든 UI를 사용할 수 있습니다.Your can use any UI that you want to let the user specify the start and end trim values. 위의 예제에서는 MediaPlayerElement 와 연결 된 MediaplaybacksessionPosition 속성을 사용 하 여 Starttimeincompositionendtimeincomposition확인 하 여 컴포지션의 현재 위치에서 재생 중인 mediaclip 를 먼저 확인 합니다.The example above uses the Position property of the MediaPlaybackSession associated with the MediaPlayerElement to first determine which MediaClip is playing back at the current position in the composition by checking the StartTimeInComposition and EndTimeInComposition. 그런 다음 PositionStarttimeincomposition 속성을 다시 사용 하 여 클립 시작 부분에서 잘라내는 시간을 계산 합니다.Then the Position and StartTimeInComposition properties are used again to calculate the amount of time to trim from the beginning of the clip. FirstOrDefault 메서드는 목록에서 항목을 선택 하는 코드를 간소화 하는 system.string 네임 스페이스의 확장 메서드입니다.The FirstOrDefault method is an extension method from the System.Linq namespace that simplifies the code for selecting items from a list.
  • Mediaclip 개체의 originalduration 속성을 사용 하면 클리핑을 적용 하지 않고 미디어 클립의 기간을 알 수 있습니다.The OriginalDuration property of the MediaClip object lets you know the duration of the media clip without any clipping applied.
  • TrimmedDuration 속성을 사용 하면 트리밍 적용 후 미디어 클립의 기간을 알 수 있습니다.The TrimmedDuration property lets you know the duration of the media clip after trimming is applied.
  • 클립의 원래 지속 시간 보다 큰 트리밍 값을 지정 하면 오류가 발생 하지 않습니다.Specifying a trimming value that is larger than the original duration of the clip does not throw an error. 그러나 컴퍼지션에 단일 클립만 포함 되 고, 대량 트리밍 값을 지정 하 여 길이가 0으로 잘린 경우 컴퍼지션에 클립이 없는 것 처럼 GeneratePreviewMediaStreamSource 에 대 한 후속 호출에서 null을 반환 합니다.However, if a composition contains only a single clip and that is trimmed to zero length by specifying a large trimming value, a subsequent call to GeneratePreviewMediaStreamSource will return null, as if the composition has no clips.

컴포지션에 배경 오디오 트랙 추가Add a background audio track to a composition

컴포지션에 배경 트랙을 추가 하려면 오디오 파일을 로드 한 다음 BackgroundAudioTrack팩터리 메서드를 호출 하 여 BackgroundAudioTrack 개체를 만듭니다.To add a background track to a composition, load an audio file and then create a BackgroundAudioTrack object by calling the factory method BackgroundAudioTrack.CreateFromFileAsync. 그런 다음 BackgroundAudioTrack 를 컴포지션의 BackgroundAudioTracks 속성에 추가 합니다.Then, add the BackgroundAudioTrack to the composition's BackgroundAudioTracks property.

private async Task AddBackgroundAudioTrack()
{
    // Add background audio
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;
    picker.FileTypeFilter.Add(".mp3");
    picker.FileTypeFilter.Add(".wav");
    picker.FileTypeFilter.Add(".flac");
    Windows.Storage.StorageFile audioFile = await picker.PickSingleFileAsync();
    if (audioFile == null)
    {
        ShowErrorMessage("File picking cancelled");
        return;
    }

    // These files could be picked from a location that we won't have access to later
    var storageItemAccessList = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList;
    storageItemAccessList.Add(audioFile);

    var backgroundTrack = await BackgroundAudioTrack.CreateFromFileAsync(audioFile);

    composition.BackgroundAudioTracks.Add(backgroundTrack);

}
  • Mediacomposition 은 MP3, WAV, FLAC 형식의 배경 오디오 트랙을 지원 합니다.A MediaComposition supports background audio tracks in the following formats: MP3, WAV, FLAC

  • 배경 오디오 트랙A background audio track

  • 비디오 파일의 경우와 마찬가지로, Storageapplicationpermissions 클래스를 사용 하 여 컴퍼지션의 파일에 대 한 액세스를 유지 해야 합니다.As with video files, you should use the StorageApplicationPermissions class to preserve access to files in the composition.

  • Mediaclip와 마찬가지로 BackgroundAudioTrack 는 한 번에 하나의 컴포지션에만 포함 될 수 있습니다.As with MediaClip, a BackgroundAudioTrack can only be included in a composition once. 컴퍼지션에서 이미 사용 중인 BackgroundAudioTrack 를 추가 하려고 하면 오류가 발생 합니다.Attempting to add a BackgroundAudioTrack that is already being used by the composition will result in an error. 컴퍼지션에서 오디오 트랙을 여러 번 다시 사용 하려면 Clone 을 호출 하 여 새 mediaclip 개체를 만든 다음이 개체를 컴퍼지션에 추가할 수 있습니다.To reuse an audio track multiple times in a composition, call Clone to create new MediaClip objects which can then be added to the composition.

  • 기본적으로 배경 오디오 트랙은 컴퍼지션 시작 시 재생을 시작 합니다.By default, background audio tracks begin playing at the start of the composition. 여러 백그라운드 트랙이 있는 경우 모든 트랙은 컴퍼지션 시작 시 재생을 시작 합니다.If multiple background tracks are present, all of the tracks will begin playing at the start of the composition. 배경 오디오 트랙이 다른 시간에 재생을 시작 하 게 하려면 Delay 속성을 원하는 시간 오프셋으로 설정 합니다.To cause a background audio track to be begin playback at another time, set the Delay property to the desired time offset.

컴퍼지션에 오버레이 추가Add an overlay to a composition

오버레이를 사용 하면 여러 계층의 비디오를 컴퍼지션에서 서로 위에 쌓을 수 있습니다.Overlays allow you to stack multiple layers of video on top of each other in a composition. 컴포지션에는 여러 오버레이 계층이 포함 될 수 있으며, 각 계층에는 여러 오버레이가 포함 될 수 있습니다.A composition can contain multiple overlay layers, each of which can include multiple overlays. Mediaclip 를 해당 생성자에 전달 하 여 mediaoverlay 개체를 만듭니다.Create a MediaOverlay object by passing a MediaClip into its constructor. 오버레이의 위치와 불투명도를 설정 하 고 새 MediaOverlayLayer 를 만든 후 해당 을 오버레이 목록에 추가 합니다.Set the position and opacity of the overlay, then create a new MediaOverlayLayer and add the MediaOverlay to its Overlays list. 마지막으로 컴퍼지션의 OverlayLayers 목록에 MediaOverlayLayer 를 추가 합니다.Finally, add the MediaOverlayLayer to the composition's OverlayLayers list.

private void AddOverlay(MediaClip overlayMediaClip, double scale, double left, double top, double opacity)
{
    Windows.Media.MediaProperties.VideoEncodingProperties encodingProperties =
        overlayMediaClip.GetVideoEncodingProperties();

    Rect overlayPosition;

    overlayPosition.Width = (double)encodingProperties.Width * scale;
    overlayPosition.Height = (double)encodingProperties.Height * scale;
    overlayPosition.X = left;
    overlayPosition.Y = top;

    MediaOverlay mediaOverlay = new MediaOverlay(overlayMediaClip);
    mediaOverlay.Position = overlayPosition;
    mediaOverlay.Opacity = opacity;

    MediaOverlayLayer mediaOverlayLayer = new MediaOverlayLayer();
    mediaOverlayLayer.Overlays.Add(mediaOverlay);

    composition.OverlayLayers.Add(mediaOverlayLayer);
}
  • 계층 내 오버레이는 포함 하는 레이어의 오버레이 목록에서 순서에 따라 z 순서로 정렬 됩니다.Overlays within a layer are z-ordered based on their order in their containing layer's Overlays list. 목록 내에서 더 높은 인덱스는 하위 인덱스 위에 렌더링 됩니다.Higher indices within the list are rendered on top of lower indices. 컴퍼지션 내 오버레이 계층의 경우에도 마찬가지입니다.The same is true of overlay layers within a composition. 컴퍼지션의 OverlayLayers 목록에서 인덱스가 더 높은 계층이 더 낮은 인덱스 위에 렌더링됩니다.A layer with higher index in the composition's OverlayLayers list will be rendered on top of lower indices.

  • 오버레이는 순차적으로 재생 되는 것이 아니라 서로 위에 쌓입니다. 모든 오버레이는 기본적으로 컴퍼지션의 시작 부분에서 재생을 시작 합니다.Because overlays are stacked on top of each other instead of being played sequentially, all overlays start playback at the beginning of the composition by default. 오버레이를 다른 시간에 재생 하기 시작 하려면 Delay 속성을 원하는 시간 오프셋으로 설정 합니다.To cause an overlay to be begin playback at another time, set the Delay property to the desired time offset.

미디어 클립에 효과 추가Add effects to a media clip

컴포지션의 각 Mediaclip 에는 여러 효과를 추가할 수 있는 오디오 및 비디오 효과 목록이 있습니다.Each MediaClip in a composition has a list of audio and video effects to which multiple effects can be added. 효과는 각각 IAudioEffectDefinitionIVideoEffectDefinition 를 구현 해야 합니다.The effects must implement IAudioEffectDefinition and IVideoEffectDefinition respectively. 다음 예제에서는 현재 MediaPlayerElement 위치를 사용 하 여 현재 표시 된 mediaclip 를 선택한 다음 VideoStabilizationEffectDefinition 의 새 인스턴스를 만들어 미디어 클립의 VideoEffectDefinitions 목록에 추가 합니다.The following example uses the current MediaPlayerElement position to choose the currently viewed MediaClip and then creates a new instance of the VideoStabilizationEffectDefinition and appends it to the media clip's VideoEffectDefinitions list.

private void AddVideoEffect()
{
    var currentClip = composition.Clips.FirstOrDefault(
        mc => mc.StartTimeInComposition <= mediaPlayerElement.MediaPlayer.PlaybackSession.Position &&
        mc.EndTimeInComposition >= mediaPlayerElement.MediaPlayer.PlaybackSession.Position);

    VideoStabilizationEffectDefinition videoEffect = new VideoStabilizationEffectDefinition();
    currentClip.VideoEffectDefinitions.Add(videoEffect);
}

파일에 컴퍼지션 저장Save a composition to a file

나중에 수정할 파일에 미디어 컴포지션을 직렬화 할 수 있습니다.Media compositions can be serialized to a file to be modified at a later time. 출력 파일을 선택한 다음 Mediacomposition 메서드 SaveAsync 를 호출 하 여 컴퍼지션을 저장 합니다.Pick an output file and then call the MediaComposition method SaveAsync to save the composition.

private async Task SaveComposition()
{
    var picker = new Windows.Storage.Pickers.FileSavePicker();
    picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
    picker.FileTypeChoices.Add("Composition files", new List<string>() { ".cmp" });
    picker.SuggestedFileName = "SavedComposition";

    Windows.Storage.StorageFile compositionFile = await picker.PickSaveFileAsync();
    if (compositionFile == null)
    {
        ShowErrorMessage("User cancelled the file selection");
    }
    else
    {
        var action = composition.SaveAsync(compositionFile);
        action.Completed = (info, status) =>
        {
            if (status != AsyncStatus.Completed)
            {
                ShowErrorMessage("Error saving composition");
            }

        };
    }
}

파일에서 컴퍼지션 로드Load a composition from a file

사용자가 컴퍼지션을 보거나 수정할 수 있도록 파일에서 미디어 컴퍼지션을 deserialize 할 수 있습니다.Media compositions can be deserialized from a file to allow the user to view and modify the composition. 컴퍼지션 파일을 선택한 다음 Mediacomposition 메서드 LoadAsync 를 호출 하 여 컴퍼지션을 로드 합니다.Pick a composition file and then call the MediaComposition method LoadAsync to load the composition.

private async Task OpenComposition()
{
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
    picker.FileTypeFilter.Add(".cmp");

    Windows.Storage.StorageFile compositionFile = await picker.PickSingleFileAsync();
    if (compositionFile == null)
    {
        ShowErrorMessage("File picking cancelled");
    }
    else
    {
        composition = null;
        composition = await MediaComposition.LoadAsync(compositionFile);

        if (composition != null)
        {
            UpdateMediaElementSource();

        }
        else
        {
            ShowErrorMessage("Unable to open composition");
        }
    }
}
  • 컴퍼지션의 미디어 파일이 앱에서 액세스할 수 있는 위치에 있지 않고 앱에 대 한 Storageapplicationpermissions 클래스의 FutureAccessList 속성에 없는 경우 컴퍼지션을 로드 하면 오류가 throw 됩니다.If a media file in the composition is not in a location that can be accessed by your app and is not in the FutureAccessList property of the StorageApplicationPermissions class for your app, an error will be thrown when loading the composition.