我正在开发一个需要我记录大量视频数据的应用程序,但我不需要全部存储它们。我需要做的是只保留录制流的最后 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
'sOnSample
方法从 .mp4 文件中手动删除不需要的数据FileSink
。
这听起来很难,因为我不知道我是否可以在没有并发问题的情况下写入文件,FileSink
而且VideoSink
我还没有找到一个好的 c# 库来帮助我处理 mp4 文件而不必处理它的结构. 我发现的唯一库是http://basemedia.codeplex.com/,但它完全没有文档(文档页面中的每个链接都会给出 404 错误)。
我开始认为这是无法完成的事情,但我想看看这里是否有人可以为我指明正确的方向。
编辑:为了清楚起见,我使用了“录制”这个词,而不是“录制”这个词,因为我说的是在视频仍在录制时修剪视频!这不是在保存后对其进行编辑,而是在我将其写入磁盘时从流中删除内容。