将预加载的 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
异常消息:
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