我有一个 Windows 应用商店应用程序,可以选择以视频文件格式导出某些数据。我的应用程序在 C# 中,但编码本身是通过放入由 David Catuhe 改编 自此示例的 C++ 库来处理的,并且运行良好。问题是我发现编码过程在高质量运行时可能需要很长时间,如果屏幕超时(例如,在 Surface RT 上)或用户切换应用程序,该过程会失败。我不完全确定失败的根源是什么,并且正在努力验证它,但即使该过程能够在没有更改的情况下暂停,我也不知道如何处理被墓碑。
在某些情况下,我可以忍受编码被中断。如果应用程序由于某种原因消失,我不想要的是必须从头开始。
据我所知,简单地关闭流而不完成视频并稍后继续写入是不可行的。有鉴于此,我考虑了几个选项,但我不知道哪一个(如果有的话)可能真的有效。我会非常感谢一些方向。
1)如果可能的话,能够简单地关闭流并稍后重新打开它会很棒,从我离开的地方开始。目前我还不能让它工作,但如果它应该工作,我很想知道。
2) 将编码进程推送到后台任务,无论是从一开始还是仅在墓碑化时。但是有没有办法将打开的流从我的应用程序传递到后台任务?如果没有,有没有办法让我的应用程序的后台任务至少在我的应用程序处于前台时运行而没有 CPU/内存限制?因为在通常绑定后台任务的非常严格的约束下进行整个编码需要数年时间。
3)当应用程序在前台时逐步渲染视频片段,然后在最后将部分拼接在一起。这样,如果编码被中断,我可以在最近的片段上接听。从我的阅读来看,这在理论上应该是可能的(我认为它属于重新混合的范畴,这将避免重新编码视频的需要)。但是我没有找到任何涵盖这种情况的示例,甚至在 C++ 中也没有(我几乎没有经验)。Transcode API 似乎不包括加入多个样本。我已经研究过使用 SharpDX 来做到这一点,但我想要使用的最有可能的候选对象(媒体会话)仅适用于桌面应用程序。
4) 将工作推送到桌面或服务器应用程序。问题是我想在 Windows RT 上运行它(所以桌面已经退出),我目前没有可以支持能够代表我的客户处理如此密集工作的服务器的业务模型。
所以我的问题是,我在这里最好的攻击线是什么?有什么方法可以在暂停期间保留我的流吗?如果,正如我所怀疑的那样,选项#3 是我最好的选择,你知道如何做的任何示例或指南吗?显然 C# 选项将是非常受欢迎的,所以我希望我忽略一个。C++ 可能没问题(因为 Ctuhe 先生的示例让我走到了这一步),但恐怕我需要一些非常具体的指导。顺便说一句,关于这方面的 MSDN 文档非常高级,以至于我对我需要组装哪些部分以及每个部分需要什么只有一个模糊的概念,更不用说如何用 C++ 编写实际程序了。
您能提供的任何帮助将不胜感激。