Ada*_*cki 16 cocoa-touch video-capture avfoundation ios
我正在尝试开发一款iPhone应用程序,它将使用相机仅记录最后几分钟/秒.例如,你录制一部电影5分钟点击"保存",只保存最后30秒.我不想实际记录五分钟然后砍掉最后30秒(这对我不起作用).这个想法叫做"循环录音".
这导致无尽的视频录制,但你只记得最后一部分.Precorder app做我想做的事.(我想在其他上下文中使用此功能)我认为这应该可以使用循环缓冲区轻松模拟.我用AVFoundation开始了一个项目.如果我能以某种方式将视频数据重定向到循环缓冲区(我将实现),那将是非常棒的.我只找到了有关如何将其写入文件的信息.
我知道我可以将视频分割成间隔并保存它们,但是保存它并重新启动相机以记录另一部分将需要时间并且可能会丢失电影中的一些重要时刻.
任何线索如何从相机重定向数据将不胜感激.
jgh*_*jgh 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
Run Code Online (Sandbox Code Playgroud)
所以现在你有了你正在寻找的数据.当你去保存这个文件时,你必须用正确的长度,样本数来更新MPV/MOV容器,你必须用每个样本的正确大小来更新'stsz'原子,比如更新具有正确电影持续时间的媒体标题和曲目标题等.我可能建议做的是在第一次运行时创建一个样本容器,您可以或多或少地使用该特定影片的相应数据覆盖/扩充.你会想要这样做,因为各种iDevices上的编码器并不都具有相同的设置,'avcC'原子包含编码器信息.
在这种情况下,您并不需要了解AVC流,因此您可能希望集中精力更新正确选择的容器格式.祝好运.
| 归档时间: |
|
| 查看次数: |
4266 次 |
| 最近记录: |