メディア コンポジションと編集Media compositions and editing

この記事では、Windows.Media.Editing 名前空間の 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. 作成したメディア コンポジションは、フラットなメディア ファイルにレンダリングして再生したり共有したりできるほか、コンポジションをディスクにシリアル化したりディスクから逆シリアル化したりすることもできるので、過去に作成されたコンポジションを読み込んで変更を加えるような機能をユーザーに提供することができます。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 をアプリで使うには、Windows.Media.Editing 名前空間に加え、関連する必要な API を含んだ Windows.Media.Core 名前空間を追加する必要があります。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.CreateFromFileAsync を呼び出し、そのビデオ クリップを格納するための新しい MediaClip オブジェクトを作成します。Once the file has been selected, create a new MediaClip object to contain the video clip by calling MediaClip.CreateFromFileAsync. そのクリップを MediaComposition オブジェクトの Clips リストに追加します。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 には、Clips リストと同じ順序でメディア クリップが出現します。Media clips appear in the MediaComposition in the same order as they appear in Clips list.

  • MediaClip をコンポジションに追加できるのは 1 回だけです。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 の最大エントリ数は 1,000 件です。リストがあふれないようアプリ側で管理する必要があります。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.

  • フレーム全体を単色で塗りつぶした MediaClip を作成するには、単一色とクリップの再生時間を指定して CreateFromColor を呼び出します。Create a MediaClip with a single color filling the entire frame by calling CreateFromColor and specifying a color and a duration for the clip.

  • MediaClip を画像ファイルから作成するには、画像ファイルとクリップの再生時間を指定して CreateFromImageFileAsync を呼び出します。Create a MediaClip from an image file by calling CreateFromImageFileAsync and specifying an image file and a duration for the clip.

  • MediaClipIDirect3DSurface から作成するには、サーフェスとクリップの再生時間を指定して CreateFromSurface を呼び出します。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);

}
  • GeneratePreviewMediaStreamSource は、MediaComposition にメディア クリップが少なくとも 1 つは存在している状態で呼び出す必要があります。まったく存在しない場合、返されるオブジェクトは 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. 両方を呼び出すことをお勧めGeneratePreviewMediaStreamSource設定と、 MediaPlayerElement ソースプロパティ セットへの変更を行うたびに、構成と、UI を更新します。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.

ユーザーがページから離れたときは、MediaPlayerElementSource プロパティと MediaStreamSource オブジェクトを 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.Media.Transcoding 名前空間の 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.UI.Core 名前空間の 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 を選んだ場合は、トランスコード処理の速度が上がってトリミングの精度が低下します。一方、Precise を選んだ場合は、トランスコード処理の速度が下がってトリミングの精度が向上します。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. 次に、Position プロパティと StartTimeInComposition プロパティをもう一度使って、クリップの先頭からトリミングする時間を計算します。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.Linq 名前空間の拡張メソッドです。リストから項目を選択するコードが、このメソッドによって単純化されます。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. ただし、コンポジションに含まれているクリップが 1 つだけであるときに、大きなトリミング値を指定したことによって長さがゼロにまでトリミングされた場合、それ以降の 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.CreateFromFileAsync を呼び出して 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);

}
  • A MediaCompositionバック グラウンドで、次の形式のオーディオ トラックをサポートしています。MP3、WAV、FLACA 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 をコンポジションに追加できるのは 1 回だけです。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. MediaOverlay オブジェクトは、そのコンストラクターに MediaClip を渡すことによって作成します。Create a MediaOverlay object by passing a MediaClip into its constructor. オーバーレイの位置と不透明度を設定したら、新しい MediaOverlayLayer を作成し、その Overlays リストに MediaOverlay を追加します。Set the position and opacity of the overlay, then create a new MediaOverlayLayer and add the MediaOverlay to its Overlays list. 最後に、その MediaOverlayLayer をコンポジションの OverlayLayers リストに追加します。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 リストにおける順序に基づいて決まります。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. これらの効果にはそれぞれ IAudioEffectDefinition または IVideoEffectDefinition が実装されている必要があります。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. 出力ファイルを選んだ後、MediaCompositionSaveAsync メソッドを呼び出してコンポジションを保存します。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

メディア コンポジションをファイルから逆シリアル化することによって、コンポジションを表示したり変更を加えたりする機能をユーザーに提供することができます。Media compositions can be deserialized from a file to allow the user to view and modify the composition. コンポジション ファイルを選んだ後、MediaCompositionLoadAsync メソッドを呼び出してコンポジションを読み込みます。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 プロパティに存在しない場合、コンポジションの読み込み時にエラーがスローされます。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.