ios无尽的video录制

我试图开发一个iPhone应用程序,将使用相机只logging最后几分钟/秒。 例如,你录制一些电影5分钟点击“保存”,只有最后30秒将被保存。 我不想实际logging五分钟,然后砍掉最后30秒(这不会为我工作)。 这个想法被称为“循环logging” 。

这导致无尽的录像,但你只记得最后一部分。 Precorder应用程序做我想做的事情。 (我想在其他上下文中使用此function)我认为这应该很容易用循环缓冲区模拟。 我开始了AVFoundation项目。 如果我能以某种方式将video数据redirect到一个循环缓冲区(我将实现),这将是非常棒的。 我只find关于如何将其写入文件的信息。

我知道我可以把video切成段落并保存,但保存并重新启动摄像机录制另一部分需要时间,并有可能在电影中丢失一些重要的时刻。

任何线索如何从相机redirect数据将不胜感激。

重要! 从iOS 8开始,您可以使用VTCompressionSession并直接访问NAL单元,而不必深入容器。


幸运的是,你可以做到这一点,我会告诉你如何,但你将不得不用MP4或MOV容器弄脏你的手。 一个有用的资源(虽然,更多的MOV特定)是苹果的QuickTime文件格式简介手册http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFPreface/qtffPreface.html#//apple_ref / DOC / UID / TP40000939-CH202-TPXREF101

首先,在录制结束前的30秒,您无法从任意点开始保存的电影,因此您必须在大约30秒的时间内使用一些I-Frame。 取决于您的关键帧间隔是多less秒,可能在几秒钟之前或之后30秒的标记。 你可以使用所有的I帧,并从任意一点开始,但是之后你可能会想重新编码video,因为它会很大。

所以知道,让我们继续前进。

第一步是设置AVAssetWriter时,您需要将其AVAssetWriterInput的expectsMediaDataInRealTime属性设置为YES。

在captureOutputcallback函数中,您可以从正在写入的文件中执行fread。 第一个fread会给你一些MP4 / MOV(不pipe你使用什么格式)头(即'ftyp'primefaces,'宽'primefaces和'mdat'primefaces的开头)。 你需要'mdat'部分的内容。 所以你将开始保存数据的偏移量将是36左右。

每次读取将获得0个或更多的AVC NAL单元。 您可以从ISO / IEC 14496-10表7-1中findNAL单元types的列表。 它们的格式与附录B中规定的略有不同,但没关系。 另外,在MP4 / MOV文件中只有IDR片和非IDR片。 IDR将是你正在寻找的I帧。

MP4 / MOV容器中的NAL单元格式如下:

4 bytes - Size [Size] bytes - NALU Data data[0] & 0x1F - NALU Type 

所以现在你有你正在寻找的数据。 当你去保存这个文件时,你必须用正确的长度,样本数量来更新MPV / MOV容器,你必须更新每个样本的正确大小的“stsz”primefaces,以及更新媒体标题和曲目标题以及正确的电影持续时间等等。 我可能会build议做的是在第一次运行时创build一个样本容器,您可以或多或less地只是用该特定电影的适当数据覆盖/增加。 您需要这样做,因为各种iDevices上的编码器并不都具有相同的设置,'avcC'primefaces包含编码器信息。

在这种情况下,您并不需要知道有关AVCstream的更多信息,因此您可能希望集中您的实验来更新正确select的容器格式。 祝你好运。