CMVideoFormatDescriptionGetH264ParameterSetAtIndex在iOS中不起作用

时间:2014-07-15 14:01:17

标签: avfoundation ios8 core-media

我正在使用VTCompressionSessionRef来压缩H.264格式的CVImageBuffer。压缩会话工作正常,我得到CMSampleBuffer的压缩回调。 当我尝试使用以下代码设置NALU参数时,它不起作用。

const uint8_t *paramenterSetPointerOut =  NULL;
size_t parameterSetSizeOut,parameterSizeCountOut;
int nalUnitHeaderLengthOut;

CMFormatDescriptionRef fdesc = CMSampleBufferGetFormatDescription(sampleBuffer);
OSStatus status = CMVideoFormatDescriptionGetH264ParameterSetAtIndex(fdesc, 0, &paramenterSetPointerOut,&parameterSetSizeOut, &parameterSizeCountOut, &nalUnitHeaderLengthOut);

CMVideoFormatDescriptionGetH264ParameterSetAtIndex API返回-12712错误。如果我在这里做错了,你能告诉我吗?

2 个答案:

答案 0 :(得分:0)

该函数有一个错误,提交一个Radar。您可以从索引0迭代,直到函数返回错误。 pset数据和大小变量都可以。

答案 1 :(得分:0)

也许为时已晚,但是此实现效果很好:

CMFormatDescriptionRef description = CMSampleBufferGetFormatDescription(sampleBuffer);

size_t numberOfParameterSets;
CMVideoFormatDescriptionGetH264ParameterSetAtIndex(description,
                                                   0, NULL, NULL,
                                                   &numberOfParameterSets,
                                                   NULL);

// Write each parameter set to the elementary stream
NSLog(@"NUMBER OF PARAMETERS %lu", numberOfParameterSets);
for (int i = 0; i < numberOfParameterSets; i++) {
    const uint8_t *parameterSetPointer;
    size_t parameterSetLength;
    CMVideoFormatDescriptionGetH264ParameterSetAtIndex(description,
                                                       i,
                                                       &parameterSetPointer,
                                                       &parameterSetLength,
                                                       NULL, NULL);
    
    // Write the parameter set to the elementary stream
    [elementaryStream appendBytes:startCode length:startCodeLength];
    [elementaryStream appendBytes:parameterSetPointer length:parameterSetLength];
}