我有一个Windows Phone 8.1 Silverlight应用程序,该应用程序使用Windows.Media.Editing.MediaComposition类将.gif文件呈现为.mp4。
某些文件将随机使RenderToFileAsync方法崩溃。您至少可以收到两种不同的错误消息,一种表明内存不足。
是否有人对变通办法有任何想法,或者对这应该如何工作有一些内幕知识?
复制:
在VS2013中创建新的C#WP8.1 Silverlight应用程序空白项目
如下所示将Usings和OnNavigatedTo添加到MainPage.xaml.cs。
在512MB模拟器中运行。观察崩溃(大部分时间)。摆弄我的价值,以使其正常工作。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using System.Windows.Media.Imaging;
using System.IO;
using Windows.Media.Editing;
using System.Diagnostics;
--
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
SystemTray.ProgressIndicator = new ProgressIndicator();
SystemTray.ProgressIndicator.IsVisible = true;
SystemTray.ProgressIndicator.IsIndeterminate= true;
var comp = new MediaComposition();
var r = new Random();
for (int i = 0; i < 190; i++)
{
var wb = new WriteableBitmap(576, 300);
for (int iPix = 0; iPix < wb.Pixels.Length; iPix++)
{
wb.Pixels[iPix] = r.Next();
}
string filename = "file" + i.ToString() + ".jpg";
var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(filename, Windows.Storage.CreationCollisionOption.ReplaceExisting);
using (var curr = await file.OpenStreamForWriteAsync())
{
wb.SaveJpeg(curr, wb.PixelWidth, wb.PixelHeight, 0, 95);
}
var clip = await MediaClip.CreateFromImageFileAsync(file, TimeSpan.FromMilliseconds(60));
comp.Clips.Add(clip);
}
// Ensure add capability to write to video library AND ID_CAP_MEDIALIB_PHOTO and change below to
// Windows.Storage.KnownFolders.VideosLibrary to see output in Videos app
var destFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
var destFile = await destFolder.CreateFileAsync("test.mp4", Windows.Storage.CreationCollisionOption.ReplaceExisting);
Debug.WriteLine("Mem use before render to disk: " + Windows.System.MemoryManager.AppMemoryUsage.ToString("N0"));
await comp.RenderToFileAsync(destFile);
Debug.WriteLine("Mem use after render to disk: " + Windows.System.MemoryManager.AppMemoryUsage.ToString("N0"));
SystemTray.ProgressIndicator.IsVisible = false;
MessageBox.Show("Done OK");
}
最佳答案
我通过Windows Phone应用程序分析内存分析器运行了您的代码。我可以确认您的应用正在运行的系统内存限制约为150 MB。 MediaComposition引擎可能需要大量内存,具体取决于输入和输出格式的大小。在您的情况下,您将添加大量剪辑。可以添加的剪辑数量受解码可用内存的限制。
老实说,MediaComposition并非旨在处理如此大量的剪辑。剪辑的预期平均数量徘徊在五个左右。
不幸的是,我无法获得我能想到的唯一可行的解决方法。我认为该解决方案可能是可行的,但不幸的是我不能再花更多的时间:您可能会使用较少的剪辑来创建多个输出文件。例如,您可以创建一个包含一到二十个图像的输出文件。然后,您可以创建第二个文件,其图像为二十一到四十。然后,您可以将这两个文件连接在一起。
我希望这有帮助,
詹姆士