视频录制到Android上的循环缓冲区

时间:2012-01-23 15:26:38

标签: android video-capture video-encoding continuous circular-buffer

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

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

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

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

主要问题,如果您不关心上述细节:我似乎无法找到将各个帧转换为Android SDK视频文件的方法。可能吗?如果没有,是否有任何可用的库(可能是本机代码)可以执行此操作?

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

谢谢。

1 个答案:

答案 0 :(得分:8)

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

使用fromSocket的静态方法ParcelFileDescriptor,您可以创建指向套接字的ParcelFileDescriptor实例。然后,致电getFileDescriptor以将FileDescriptor传递给MediaRecorder

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