Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保留录制视频的最后X分钟_C#_Video_Windows Phone 8_Bytearray_Mp4 - Fatal编程技术网

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

C# 保留录制视频的最后X分钟,c#,video,windows-phone-8,bytearray,mp4,C#,Video,Windows Phone 8,Bytearray,Mp4,我正在开发一个应用程序,它要求我记录大量视频数据,但我不需要全部存储。 我需要做的是只保留录制的流的最后X分钟 这意味着每当我需要存储一个新的样本时,我都需要一种方法来移除最旧的样本 所以我开始写这篇文章: 我的第一个想法是只调用StopVideoRecording(),然后使用计时器每隔X分钟调用StartVideoRecording() 现在,一开始这是有道理的,但它不会起作用 问题是这样做会每X分钟删除一次以前的数据 这意味着,如果我们记录12分钟,我们需要保留最后5分钟,按照这个想法,我

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

这意味着每当我需要存储一个新的样本时,我都需要一种方法来移除最旧的样本

所以我开始写这篇文章:

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

现在,一开始这是有道理的,但它不会起作用

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

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

然后我将注意力转移到
VideoSink
类,因为
OnSample
方法

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

当缓冲区已满时,我们只需在添加新样本之前向左移动所有内容。 问题是,一个仅1分钟的测试视频就产生了2GB的样本,这使得这种方式很难管理

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

是的,我说的是将数组写入一个文件,因为我们需要以某种方式保存这个视频。电池可能会停止工作,而把它放在RAM中会让我们丢失所有记录的东西

我想到的最后一个想法是使用
VideoSink
FileSink
的组合。 虽然
FileSink
具有压缩魔法(我甚至对这个类进行了反编译以了解它的功能,但里面没有代码!),但我们使用
VideoSink
OnSample
方法手动从
FileSink
使用的mp4文件中删除不需要的数据

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

我开始认为这是不可能做到的,但我想看看这里是否有人能为我指明正确的方向

编辑: 为了清楚起见,我使用了“录制”这个词,而不是“录制”这个词,因为我说的是在视频仍在录制时对其进行剪辑!
这并不是在保存后对其进行编辑,而是更像是在将其写入磁盘时从流中删除内容。

我无法向您提供代码,而只是一个想法。因为您有以下要求:

  • 我需要做的是只保留录制流的最后X
    分钟
  • 目标平台是windows phone 8
  • 我想对您的第一个想法进行一些修改:

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

  • 这个主意听起来很酷,我会尽快尝试,完成后我会报告