2016-09-18 2 views
1

Сообщения об исключении:Добавления предустановленных MediaClips к MediaComposition.Clips бросает System.ArgumentException

Exception брошенного: 'System.ArgumentException' в mscorlib.ni.dll

WinRT информации: Элемент уже используется

Параметр неверный.

Код:

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 в один экземпляр.

ответ

1

композиция сохраняется в виде файла 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 
+0

Thank you Sunteen! – Kinani

Смежные вопросы