10

我正在寻找将连续视频捕获到 SD 卡上的循环缓冲区的最佳方法(如果有的话……),从而允许用户在事件发生后捕获事件。

标准的视频录制 API 允许您直接写入文件,当您达到限制(由用户设置,或 SD 卡的容量)时,您必须停止并重新开始录制。这将创建一个长达 2 秒的长窗口,其中不运行录制。这就是 DailyRoads Voyager 等现有应用程序已经在做的事情。为了最大程度地减少错过重要内容的机会,您可以将拆分时间设置为较长的​​时间,例如 10 分钟,但如果事件发生在此时间跨度的末尾附近,您会在开始时存储 9 分钟的空内容,从而浪费空间。

所以,我现在的想法如下:我将有一个大文件作为缓冲区。我将使用我找到的一些代码来捕获帧并将它们自己保存到文件中,最后环绕。当用户想要保留某些部分时,我将通过指向缓冲区开始和结束的指针来标记它。记录可以像以前一样继续,跳过标记为保留的区域。

在录制停止后,或者可能在后台线程上(取决于电话/卡速度)我会将标记的区域复制到另一个文件并删除覆盖保护。

主要问题,如果您不关心上面的细节:我似乎无法找到将单个帧转换为 Android SDK 中的视频文件的方法。是否可以?如果没有,是否有任何可用的库(可能是本机代码)可以做到这一点?

我真的不关心未压缩帧的大缓冲区,但导出的视频应该以 Android 友好的格式压缩。但是,如果有办法压缩缓冲区,我想听听。

谢谢你。

4

1 回答 1

10

在 Android 中MediaRecorder,有两种方法可以指定输出。一个是文件名,另一个是FileDescriptor.

使用静态方法可以创建一个指向套接字fromSocket的实例。然后,调用以将 传递给.ParcelFileDescriptorParcelFileDescriptorgetFileDescriptorFileDescriptorMediaRecorder

由于您可以从套接字获取编码的视频(就像您正在创建本地 Web 服务器一样),您将能够访问视频的各个帧,尽管不是那么直接,因为您需要先对其进行解码。

于 2012-01-31T07:45:34.620 回答