我正在尝试从 .mov 文件中解析 H.264 帧。我想我已经得出结论,来自 FFMPEG 的 AVFormat-part 的 mov.c 是要走的路。但是 mov.c 是未注释代码旁边的约 2600 行代码。我正在寻找使用 FFMPEG 的示例,尤其是解析任何文件类型的结构。不管是 MPEG4 还是 Quicktime Movie,因为它们在结构上非常相似。
如果没有现有示例(我找不到任何示例),也许有人已经使用它并且可以给我几行代码,或者解释如何开始?
我正在尝试做的事情:我使用 AVCaptureSession 从摄像机捕获样本,然后这些样本在 H264 中编码并在 AVAssetsWriter、AVAssetsWriterInput 和 AVAssetsWriterInputPixelBufferAdaptor 的帮助下写入文件。原因是我不能直接访问硬件 H264 编码,因为苹果不允许这样做。我现在需要做的(我认为不确定)是解析出:
.mov 文件中的“ mdat ”-atom(电影数据,我认为可能不止一个)。然后是“ vide ”-atom,然后是 vide-atom 内(视频数据样本,可能不止一个)。我认为会有几个我相信是框架的原子。这些将是“avc1”类型(这是 H264 的类型)。请纠正我,因为我很确定我还没有正确理解所有这些。
那么我的问题是,我将如何解析单帧。我一直在阅读文档并查看了iFrameExtractor(这不是很有帮助,因为它会解码帧)。我想当我应该使用来自 FFMPEG-AVFormat 的 mov.c 时,我已经正确理解了,但我不确定。
编辑:我现在正在尝试这样:
我运行略微简化的初始化函数 iFrameExtractor,它在 .mov 文件中找到视频流。
我得到这样的框架数据:
AVPacket packet; av_read_frame(pFormatCtx, &packet); NSData *frame; if(packet.stream_index == videoStream){ frame = [NSData dataWithBytes:packet.data length:packet.size]; } videoStream++; av_free_packet(&packet); return frame;
然后我将它传递给 NSOperation 的子类,并保留它以等待上传。但我收到 EXC_BAD_ACC,从帧复制数据时我做错了吗?有任何想法吗。当我尝试NSData* frame
使用其(非原子,保留)属性设置类变量时,我得到了 EXC_...。(它在合成行上显示 EXC_BAD_ACC)