将预加载的 MediaClip 添加到 MediaComposition.Clips 会引发 System.ArgumentException

Adding preloaded MediaClips to MediaComposition.Clips throws System.ArgumentException

异常消息:

Exception thrown: 'System.ArgumentException' in mscorlib.ni.dll

WinRT information: Element is already in use

The parameter is incorrect.

代码:

composition = await MediaComposition.LoadAsync(timelineCMPOutputFile);
composition2 = await MediaComposition.LoadAsync(timelineCMPOutputFile2);

//TODO: Warn user to select the oldest first.
try
{
    for (int i = 0; i < composition2.Clips.Count; i++)
    {
         composition.Clips.Add(composition2.Clips[i]); // Exception throws here.
    }
}
catch(Exception ex)
{
    System.Diagnostics.Debug.WriteLine(ex.Message.ToString());
}

var action = composition.SaveAsync(timelineCMPOutputFile);

基本上我想做的是将两个 MediaComposition.Clips 合并到一个实例中。

作品保存为 XML 文件,其中包含有关作品的元数据,例如源媒体文件、剪辑排列、叠加和应用于作品的效果,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Composition>
  <Clips>
    <MediaClip ExpectedOriginalDuration="5816533125" Path="C:\Users\username\AppData\Local\Packages\Microsoft.SDKSamples.MediaEditingSample.CS_8wekyb3d8bbwe\LocalState\temp.mp4"/>
  </Clips>
</Composition>

我们从XML文件中得到的剪辑信息不是媒体源的剪辑,它们是定义原始源路径的元数据。似乎只有从媒体文件创建的剪辑才能成功添加到合成中。所以解决方案是通过 MediaComposition.RenderToFileAsync 将第二个加载的合成渲染到媒体文件,然后从该文件创建一个新剪辑。最后,将新剪辑添加到第一个加载的合成中以完成合并。更新代码如下。

 StorageFile timelineCMPOutputFile = await ApplicationData.Current.LocalFolder.GetFileAsync("timelineCMPOutputFile");
 StorageFile timelineCMPOutputFile2 = await ApplicationData.Current.LocalFolder.GetFileAsync("timelineCMPOutputFile2");
 var composition = await MediaComposition.LoadAsync(timelineCMPOutputFile);
 var composition2 = await MediaComposition.LoadAsync(timelineCMPOutputFile2);
 //TODO: Warn user to select the oldest first.
 try
 {
     await composition2.RenderToFileAsync(await ApplicationData.Current.LocalFolder.CreateFileAsync("temp.mp4", CreationCollisionOption.ReplaceExisting));
     StorageFile tempfile = await ApplicationData.Current.LocalFolder.GetFileAsync("temp.mp4");
     MediaClip firstClip = await MediaClip.CreateFromFileAsync(tempfile);            
     composition.Clips.Add(firstClip); /// Exception throws here.
 }
 catch (Exception ex)
 {
     System.Diagnostics.Debug.WriteLine(ex.Message.ToString());
 }

 var action = composition.SaveAsync(timelineCMPOutputFile);

 // Combine two video files together into one