我正在开发一款需要我录制大量视频数据的应用,但我不需要将它们全部存储起来。 我需要做的是保持录制流的最后X分钟。
这意味着每次我需要存储一个新样本时,我需要一种方法来删除最旧的样本。
所以我开始使用这篇文章:http://msdn.microsoft.com/library/windowsphone/develop/hh394041%28v=vs.105%29.aspx
我的第一个想法是每隔X分钟使用一个计时器调用StopVideoRecording()
然后调用StartVideoRecording()
。
现在,起初这是有道理的,但它不起作用。
问题是,这样做会每X分钟删除以前的数据。
这意味着,如果我们记录12分钟,我们需要保留最后5分钟,按照这个想法,我们将删除前5个,然后是后5个,只留下最后2分钟,这不是我的意思寻找。
由于VideoSink
方法,我将注意力转移到了OnSample
类。
这看起来很简单,我们拦截每个样本,然后将它存储在固定大小的字节数组中(大小取决于所需的长度和样本的大小)。
当缓冲区已满时,我们只需移动左侧的所有内容,然后再添加新样本。 问题是只需1分钟的测试视频会产生2GB样本,这样就很难管理。
我知道这些样本是未压缩的,但对于智能手机来说,获取样本,压缩它,移动大数组,插入样本并将数组写入文件并在每个文件上执行都不会很难收到样品?
是的,我正在谈论将数组写入文件,因为我们需要以某种方式保留此视频。可能会发生电池停止工作,将其放在RAM中会让我们放弃我们录制的所有内容!
我想到的最后一个想法是使用VideoSink
和FileSink
的组合。
虽然FileSink
执行了压缩魔法(我甚至反编译了这个类以了解它的作用,但内部没有代码!),我们使用VideoSink
的{{1}}方法手动删除OnSample
使用的mp4文件中不需要的数据。
这个听起来很难,因为我不知道是否可以用FileSink
和FileSink
写入文件而没有并发问题,而且我找不到一个好的c#库来帮助我使用mp4文件而不必处理它的结构。
我找到的唯一一个库是http://basemedia.codeplex.com/,但它完全没有文档(文档页面中的每个链接都会出现404错误)。
我开始认为这是无法做到的事情,但我想看看这里是否有人可以指出我正确的方向。
编辑: 为了清楚起见,我使用了“录制”字而不是“录制”字,因为我正在谈论修剪视频,而它仍在录制! 这不是关于保存后编辑它,而是更像是在我将其写入磁盘时从流中删除内容。
答案 0 :(得分:1)
我无法向您提供代码,只是一个想法。因为你有要求:
minutes
。windows phone 8
我想对你的第一个想法添加一些修改:
DirectShow
,您可以将这些文件合并为一个。准备好使用C++
(作为替代方案,您可以使用某些服务或为此制作自己的后端)