我具有由类型1(P帧)的H.264 / AVC的NAL,5(I帧),图7(SPS)的流,和8(PPS)。 我想他们撰写成.mov文件而无需重新编码。 我试图用AVAssetWriter
做到这一点。 对于文档AVAssetWriterInput
指出:
通过零为outputSettings指示输入通过所附样本,做任何处理它们被写入到输出文件之前。 如果,例如,要附加中已经存在一个理想的压缩格式的缓冲区,这非常有用。 然而,直通目前只写QuickTime影片文件时(即AVAssetWriter与AVFileTypeQuickTimeMovie初始化)的支持。 对于其他类型的文件,必须指定非空输出设置。
我试图创建CMSampleBuffers这些的NAL并将其追加到资产作家输入,但我无法输入的数据在产生一个结构良好的.mov文件的方式,我无法找到任何线索任何地方如何做到这一点。
到目前为止我已经得到最好的结果是通过在的NAL附件B字节流格式(按顺序7 8 5 1 1 1 ....重复)和演奏的结果在VLC。 正因为如此,我知道的NAL包含有效数据,但由于.mov文件没有一个AVCC原子和原子的mdat充满了附件B字节流的QuickTime不会播放视频。
现在正在尝试与一个4字节的的NAL通过(由指定的lengthSizeMinusOne
字段)长度字段,而不是附件B定界符,这是他们如何应该尽可能被打包到的mdat原子作为我的知道。
我在为如何让资产作家写一个AVCC原子的损失。 每样我只是追加被塞进了MDAT原子。
有谁知道我可以通过原始H.264数据转换成通过(零outputSettings)配置为通的AVAssetWriterInput,让其生成正确格式的QuickTime文件?
我已经提交了TSI与苹果和找到了答案。 我希望这可以节省有人在未来的时间。
所述CMSampleBuffers具有与它们相关联的CMFormatDescription,其中包含的数据的在样品缓冲液中的描述。
函数原型用于创建格式描述如下:
OSStatus CMVideoFormatDescriptionCreate (
CFAllocatorRef allocator,
CMVideoCodecType codecType,
int32_t width,
int32_t height,
CFDictionaryRef extensions,
CMVideoFormatDescriptionRef *outDesc
);
我了解到,从Apple技术员,我可以使用扩展参数在含有AVCC原子数据字典来传递。
扩展字典应为以下形式:
[kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms ---> ["avcC" ---> <avcC Data>]]
在[]的表示字典。 此字典可以潜在地用于在用于从AVCC一边任意原子数据通过。
下面是我用来创建代码extensions
字典,我进入CMVideoFormatDescriptionCreate
:
const char *avcC = "avcC";
const CFStringRef avcCKey = CFStringCreateWithCString(kCFAllocatorDefault, avcC, kCFStringEncodingUTF8);
const CFDataRef avcCValue = CFDataCreate(kCFAllocatorDefault, [_avccData bytes], [_avccData length]);
const void *atomDictKeys[] = { avcCKey };
const void *atomDictValues[] = { avcCValue };
CFDictionaryRef atomsDict = CFDictionaryCreate(kCFAllocatorDefault, atomDictKeys, atomDictValues, 1, nil, nil);
const void *extensionDictKeys[] = { kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms };
const void *extensionDictValues[] = { atomsDict };
CFDictionaryRef extensionDict = CFDictionaryCreate(kCFAllocatorDefault, extensionDictKeys, extensionDictValues, 1, nil, nil);
文章来源: AVAssetWriterInput H.264 Passthrough to QuickTime (.mov) - Passing in SPS/PPS to create avcC atom?