在应用程序中编码视频时减轻暂停和/或终止

时间:2013-05-08 17:59:38

标签: c# c++ windows-8 windows-runtime

我有一个Windows应用商店应用,可以选择以视频文件格式导出某些数据。我的应用程序是在C#中,但编码本身是通过放入由David Catuhe改编自this sample的C ++库来处理的,并且运行良好。问题是,我发现在高质量运行时编码过程可能需要很长时间,如果屏幕超时(例如,在Surface RT上)或用户切换应用程序,则该过程失败。我不完全确定失败的原因是什么,并且正在努力验证它,但即使该过程能够在没有变化的情况下保持暂停,我也不知道如何处理被墓碑化。

我可以忍受编码在某些情况下被中断。如果应用程序由于某种原因消失,我不想要从头开始。

据我所知,在没有完成视频的情况下简单地关闭流并且稍后继续写入视频是不可行的。鉴于此,我考虑了一些选项,但我无法分辨哪些(如果有的话)实际上可行。我非常感谢某些方向。

1)如果可能的话,能够简单地关闭流并稍后重新打开它,然后从我离开的地方继续前进是很棒的。目前我无法让这个工作,但如果它应该工作,我很想知道。

2)将编码过程从开始或仅在逻辑删除时推送到后台任务。但有没有办法将我的应用程序中的开放流传递给后台任务?如果没有,有没有办法让我的应用程序的后台任务在没有CPU /内存限制的情况下运行,至少在我的应用程序处于前台时?因为在通常绑定后台任务的非常严格的约束内进行整个编码需要数年时间。

3)在应用程序处于前景时逐步渲染视频片段,然后在末尾将各部分拼接在一起。这样,如果编码被中断,我可以在最近的段中获取。根据我的阅读,这在理论上应该是可能的(我认为它属于remuxing类别,这将避免重新编码视频的需要)。但我没有找到任何覆盖这种情况的样本,即使在C ++中也没有(我几乎没有经验)。 Transcode API似乎不包括连接多个样本。我已经开始使用SharpDX来做这件事了,但我最想要使用的东西(媒体会话)只能用于桌面应用程序。

4)将工作推送到桌面或服务器应用程序。问题是我希望在Windows RT上运行(因此桌面已经用完)并且我目前没有可以支持能够代表客户处理此类密集工作的服务器的商业模式。

所以我的问题是,我最好的攻击线是什么?有没有什么方法可以暂停我的流?如果,正如我怀疑的那样,选项#3是我最好的选择,你知道有关如何做的任何样本或指南吗?显然C#选项是非常受欢迎的,所以我希望我能忽略一个。 C ++可能没问题(就像Catuhe先生的样本让我这么远),但我担心我需要一些非常具体的指导。顺便说一下,关于这个问题的MSDN文档非常高级,我对于我需要组装哪些部分以及每个部分需要的内容只有一个模糊的概念,更不用说如何用C ++编写实际的程序了。

非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

不幸的是,我没有足够的声望点来评论所以我必须给出答案。

您可以考虑#3和#4的组合。在应用内呈现细分,然后上传细分以拼接在一起。这将使您回到使用商品解决方案创建最终输出的领域。