ios无尽的录像

我正在尝试开发一个iPhone应用程序,它将使用相机记录最后几分钟/秒.
例如,您可以录制一部电影5分钟,点击“保存”,只保留最后30秒.我不想实际记录五分钟,然后切断30年代(这不会为我工作).这个想法叫做 “Loop recording”.

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

我知道我可以将视频片段间隔并保存起来,但是保存它并重新启动摄像机以录制另一部分将需要时间,并且有可能在电影中丢失一些重要的时刻.

任何线索如何从相机重定向数据将不胜感激.

解决方法

重要!从iOS 8起,您可以使用VTCompressionSession并直接访问NAL单元,而不必通过该容器挖掘.

幸运的是,你可以做到这一点,我会告诉你如何,但是你必须用MP4或MOV容器让你的手变脏.苹果公司的Quicktime文件格式介绍手册对此有用的资源(尽管如此,更具体的MOV)
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的expectsMediaDataInRealTime属性设置为YES.

在captureOutput回调中,您可以从正在写入的文件中进行读取.第一个fread会给你一些MP4 / MOV(你使用的格式)标题(即’ftyp’atom,’wide’atom,’mdat’atom的开头).你想要什么在’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流,因此您可能需要集中精力进行更新您选择的容器格式的实验.祝你好运.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...