问题一:MTK平台H264编码相关:
第三方软件反馈使用我们终端h264编码level_idc和视频分辨率和h264规范不一样,不标准,所以测试了一下、确认一下问题,一查还真查出来了大问题。测试三款mtk平台的终端Android5.1、Android6.1系统都一样存在这个问题。就是无论录像多少分辨率它硬编码的level_idc用于是41,搞笑了,正常按照h264规范录制视频分辨率要和leved_idc匹配的。
MTK Android6.1录像视频SPS解析level_idc:
高通平台Android5.1 H264录像SPS解析level_idc:
MTK这个bug系统ROM能不能解决?
硬编码:
无解,profile_Idc和level_idc的填充在mtk的平台 *.so库中,除非在系统中增加对视频的SPS的解码,置换相应的位后再编码为相应格式,不现实。硬编码系统增加log打印到MediaCodecSource::initEncoder()后就无什么相关log,应该就到mtk平台自带的*.so库了。
查了一些资料,最后说这些也不算是bug,H264也标准也允许你这么做。
profile_idc和level_idc是指比特流所遵守的配置和级别。
constraint_set0_flag 等于1是指比特流遵从H264某节中的所有规定。constraint_set0_flag 等于0是指该比特流可以遵从也可以不遵从某节中的所有规定。当profile_idc等于100、110、122或144时,constraint_set0_flag、constraint_set1_flag和constraint_set2_flag都应等于0。
软编码:
软件编码有没有这个问题未测试,看了一下代码,软编码Android5.1有对profile_idc和level_idc的填充部分,如果有问题系统应该可以做处理。代码大概流程图如下:
问题二:MTK 平台H264解码相关:
测试发现,同一个视频使用“Elecard StreamEye Tools”解析出来的profile_idc和level_idc和使用MTK平台Android5.1系统解析出来不一样!又搞笑了……怀疑MTK之前平台的H264编解码不完善(也可能Android5.1、Android6.1系统太老了)!
“Elecard StreamEye Tools”软件解析:
MTK Android5.1解析视频的profile_idc和level_idc:
/storage/emulated/0/Movies/mate20_1920x1080.mp4
[OMX.MTK.VIDEO.DECODER.AVC] AVC profile = 66 (Baseline), level = 50
/storage/emulated/0/Movies/mate20_1280x720.mp4
[OMX.MTK.VIDEO.DECODER.AVC] AVC profile = 66 (Baseline), level = 50
两个视频MTK平台解析出来和“Elecard StreamEye Tools”工具不一样,怀疑MTK对H264规范支持不完善。