保留录制视频的最后X分钟

本文关键字:最后 分钟 视频 保留 | 更新日期: 2023-09-27 18:32:18

我正在开发一个应用程序,它需要我录制大量视频数据,但我不需要存储所有数据。我需要做的是只保留录制流的最后 X 分钟。

这意味着我需要一种方法来删除每次需要存储新样本时最旧的样本。

所以我开始写这篇文章:http://msdn.microsoft.com/library/windowsphone/develop/hh394041%28v=vs.105%29.aspx

我的第一个想法是每X分钟使用计时器调用StopVideoRecording()然后调用StartVideoRecording()

现在,起初这是有道理的,但它不会起作用。

问题是这样做会每 X 分钟删除一次以前的数据。

这意味着,如果我们记录 12 分钟并且我们需要保留最后 5 分钟,按照这个想法,我们将删除前 5 分钟,然后删除后 5 分钟,只留下最后 2 分钟,这不是我想要的。

然后,由于OnSample方法,我将注意力转移到VideoSink类上。

这看起来很简单,我们截获每个样本并将其存储在一个固定大小的字节数组中(大小取决于所需的长度和样本的大小)。

当缓冲区已满时,我们只需在添加新样本之前将所有内容移到左侧。问题在于,仅 1 分钟的测试视频生成了大约 2GB 的样本,这使得这种方式非常难以管理。

我知道这些样本是未压缩的,但对于智能手机来说,获取样本、压缩样本、移动大数组、插入样本并将数组写入文件并在收到的每个样本上执行此操作并不难?

是的,我说的是将数组写入文件,因为我们需要以某种方式保留此视频。可能会发生电池停止工作的情况,并且仅将其放在RAM中会让我们丢失录制的所有内容!

想到的最后一个想法是 使用VideoSinkFileSink的组合 .虽然FileSink做了压缩魔法(我什至反编译了这个类以了解它的作用,但里面没有代码!),我们使用VideoSinkOnSample方法手动从FileSink使用的mp4文件中删除不需要的数据。

这听起来很难,因为我不知道我是否可以同时使用 FileSinkVideoSink 写入文件而没有并发问题,而且我没有找到一个好的 c# 库来帮助我处理 mp4 文件而不必处理其结构。我找到的唯一库是这个 http://basemedia.codeplex.com/,但它完全缺乏文档(文档页面中的每个链接都给出 404 错误)。

我开始认为这是无法做到的,但我想看看这里是否有人可以指出我正确的方向。

编辑:需要明确的是,我使用了"录制"一词而不是"录制"一词,因为我谈论的是修剪视频,而视频仍在录制!这不是关于在保存后对其进行编辑,而是更像是在我将其写入磁盘时从流中删除内容。

保留录制视频的最后X分钟

我不能为您提供代码,而只是一个想法。因为您有要求:

  1. 我需要做的是只保留录制流的最后 X minutes
  2. 目标平台windows phone 8

我想对你的第一个想法进行一些修改:

  1. 将每一分钟的视频流写入单独的文件中
  2. 此外,您还需要将+1视频文件保留几分钟以上。例如,如果您需要 5 分钟,您应该始终保留 6 个文件,因为最后一个文件可能未满。
  3. 通过使用DirectShow您将能够将这些文件合并为一个。准备好使用C++(作为替代方案,您可以使用一些服务或为此制作自己的后端)