композиция сохраняется в виде файла 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
Thank you Sunteen! – Kinani