c# - MediaComposition.RenderToFileAsync 因许多静态图像而崩溃

标签 c# silverlight windows-phone-8

我有一个 Windows Phone 8.1 Silverlight 应用程序,它使用 Windows.Media.Editing.MediaComposition 类将 .gif 文件呈现为 .mp4。

某些文件会随机地使 RenderToFileAsync 方法崩溃。您至少会收到两种不同的错误消息,一种是内存不足。

有没有人有任何解决方法的想法,或者关于它应该如何工作的一些内幕知识?

复制:

  • 在 VS2013 中创建新的 c# WP8.1 Silverlight 应用空白项目
  • 如下所示将 Usings 和 OnNavigatedTo 添加到 MainPage.xaml.cs。
  • 在 512MB 的模拟器中运行。观察崩溃(大部分时间)。调整 i 的值以查看它是否正常工作。

    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 并不是为处理如此大量的剪辑而设计的。预期的平均剪辑数量徘徊在五个左右。

不幸的是,我无法找到我能想到的唯一可行的解​​决方法。我认为这个解决方案可能是可行的,但遗憾的是我不能再花时间研究它了:您可能会使用较少数量的剪辑创建多个输出文件。例如,您可以创建包含图像 1 到 20 的输出文件。然后您可以创建第二个文件,其中包含图像 21 到 40。然后您可以将这两个文件连接在一起。

希望对你有帮助

詹姆斯

关于c# - MediaComposition.RenderToFileAsync 因许多静态图像而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27341312/

相关文章:

C# 线程,如何让线程运行带有参数的方法?

c# - 如何将列表框中的记录显示到数据表或 GridView ?

silverlight - 是什么导致我的 WP7 应用程序崩溃?

javascript - 跨域可编写脚本的 Silverlight 应用程序

fonts - 如何更改 Windows Phone 8 中的字体?

c# - WP8 大量内存泄漏

c# - 如何创建和设置多态属性?

c# - Azure 搜索索引器能否覆盖通过 API 发布的更新?

silverlight - Silverlight 中的默认字符串格式

c# - 列表框的SelectionChanged事件如何获取textblock文本值wp8