问题描述:
在 app 中使用 :
mMediaRecorder.setVideoEncodingProfileLevel(MediaCodecInfo.CodecProfileLevel.AVCProfileHigh,
MediaCodecInfo.CodecProfileLevel.AVCLevel51);
来设置编码等级, 开始录像的时候报错,无法成功录像:
01-09 15:54:58.654 400 2268 W ACodec : [OMX.rk.video_encoder.avc] stopping checking profiles after 32: 8/1
01-09 15:54:58.654 400 2268 E ACodec : [OMX.rk.video_encoder.avc] configureCodec returning error -1010
01-09 15:54:58.683 400 1105 E StagefrightRecorder: Failed to create video encoder
经过debug 发现,在ACodec.cpp的 ACodec::verifySupportForProfileAndLevel 函数中
enum {
kMaxIndicesToCheck = 32, // used when enumerating supported formats and profiles
};
他会去 omx il中查找 支持的 profile and level:
status_t err = mOMXNode->getParameter(
OMX_IndexParamVideoProfileLevelQuerySupported,
¶ms, sizeof(params));
而 omx il 的代码中:
hardware\rockchip\omx_il\component\video\enc\Rkvpu_OMX_VencControl.c
kProfileLevels 数组有 48 个,大于 kMaxIndicesToCheck 的 32 个。
static const CodecProfileLevel kProfileLevels[] = {
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel42 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel5 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel51 },
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1b},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel11},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel12},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel13},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel2},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel21},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel22},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel3},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel31},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel32},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel4},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel41},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel42},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel5},
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel51},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1b},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel11},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel12},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel13},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel2},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel21},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel22},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel3},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel31},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel32},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel4},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel41},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel42},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel5},
{ OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel51},
};
所以刚判断到 OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1 的时候,就跳出来了:
01-09 15:54:58.654 400 2268 W ACodec : [OMX.rk.video_encoder.avc] stopping checking profiles after 32: 8/1
解决方法:
所以可以 针对 h264 对 kMaxIndicesToCheck 这个值进行修改,或者通过其他办法修改,让他跑完整个数组。