例如,您可以录制一部电影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 Datadata[0] & 0x1F - NALU Type
所以现在你有你要找的数据.当您保存此文件时,您必须更新MPV / MOV容器,具有正确的长度,样品计数,您必须更新每个样品的正确尺寸的“stsz”原子,如更新媒体头和跟踪标题,电影持续时间等等.我可能建议做的是在第一次运行时创建一个样本容器,您可以或多或少仅仅使用该特定电影的适当数据覆盖/扩充.您将要这样做,因为各种IDevices上的编码器并不都具有相同的设置,“avcC”原子包含编码器信息.
在这种情况下,您并不需要非常了解AVC流,因此您可能需要集中精力进行更新您选择的容器格式的实验.祝你好运.
总结以上是内存溢出为你收集整理的ios无尽的录像全部内容,希望文章能够帮你解决ios无尽的录像所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)