ios无尽的视频录制

时间:2012-08-05 17:03:51

标签: ios cocoa-touch avfoundation video-capture

我正在尝试开发一款iPhone应用程序,它将使用相机仅记录最后几分钟/秒。 例如,你录制一部电影5分钟点击“保存”,只保存最后30秒。我不想实际记录五分钟然后砍掉最后30秒(这对我不起作用)。这个想法叫做"Loop recording"

这导致无尽的视频录制,但您只记得最后一部分。 Precorder app做我想做的事。 (我希望在其他情况下使用此功能) 我认为这应该可以使用Circular buffer轻松模拟。 我用AVFoundation开始了一个项目。如果我能以某种方式将视频数据重定向到循环缓冲区(我将实现),那将是非常棒的。我只找到了有关如何将其写入文件的信息。

我知道我可以将视频分割成间隔并保存,但保存并重新启动相机以录制其他部分需要时间,这可能会在电影中失去一些重要时刻。

任何线索如何从相机重定向数据都将受到赞赏。

1 个答案:

答案 0 :(得分:10)

重要! 从iOS 8开始,您可以使用VTCompressionSession直接访问NAL设备,而无需深入挖掘容器。


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

首先,你无法在录制结束前30秒从任意点开始保存的电影,你必须在大约30秒内使用一些I-Frame。根据您的关键帧间隔是什么,它可能是在30秒标记之前或之后的几秒钟。您可以使用所有I帧并从任意点开始,但之后您可能想要重新编码视频,因为它会非常大。

知道这一点,让我们继续前进。

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

在captureOutput回调中,您将能够从您正在写入的文件中执行fread。第一个fread会给你一点MP4 / MOV(你使用的任何格式)标题(即'ftyp'原子,'宽'原子和'mdat'原子的开头)。你想要'mdat'部分中的内容。因此,您开始保存数据的偏移量将是36左右。

每次阅读都会获得0个或更多AVC NAL单位。您可以在ISO / IEC 14496-10表7-1中找到NAL单元类型的列表。它们的格式与附件B中的格式略有不同,但没关系。此外,MP4 / MOV文件中只有IDR切片和非IDR切片。 IDR将是你想要坚持的I-Frame。

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

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

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

在这种情况下,您真的不需要了解AVC流,因此您可能希望集中精力更新正确选择的容器格式。祝你好运。