当前位置: 首页 > news >正文

如何判断硬件解码器或者软件解码器

方法一:

根据源码frameworks/av/media/libstagefright/MediaCodecList.cpp

bool MediaCodecList::isSoftwareCodec(const AString &componentName) { return componentName.startsWithIgnoreCase("OMX.google.") || componentName.startsWithIgnoreCase("c2.android.") || (!componentName.startsWithIgnoreCase("OMX.") && !componentName.startsWithIgnoreCase("c2.")); }

根据这段代码的逻辑,OMX.google和c2.android开头的就是原生的软件解码器

此外的OMX或者c2开头,就是硬件解码器,如c2.qti.avc.decoder

media_codecs.xml文件路径:
code:android/device/qcom/msm8996(平台名)或者android/frameworks/av/media/libstagefright/data
设备:/vendor/etc/media_codecs.xml

这个文件被frameworks/av/media/libstagefright/xmlparser/MediaCodecsXmlParser.cpp解析。

方法二:

在APP中从MediaCodecInfo中使用isHardwareAccelerated()获取相关信息,参考以下代码

private boolean isH265Supported() { MediaCodecList codecList = new MediaCodecList(MediaCodecList.ALL_CODECS); boolean isHardware = false; for (MediaCodecInfo codecInfo : codecList.getCodecInfos()) { String name = codecInfo.getName(); if (name.contains("hevc") && name.contains("decoder")) { Log.i("硬解", "===>分析中: " + name + " ==="); String architecture = getArchitectureType(name); Log.i("硬解", "===>类型: " + architecture); isHardware = codecInfo.isHardwareAccelerated(); Log.i("硬解", "===>支持硬件加速: " + isHardware); analyzePerformanceCharacteristics(codecInfo); } } return isHardware; } private static String getArchitectureType(String codecName) { if (codecName.startsWith("OMX.qcom.")) { return "Qualcomm VPU (Video Processing Unit) - 专用视频硬件"; } else if (codecName.startsWith("OMX.")) { return "Vendor VPU - 厂商专用视频硬件"; } else if (codecName.startsWith("c2.android.")) { return "CPU Software - 中央处理器软件解码"; } else if (codecName.startsWith("c2.")) { return "Modern VPU/DSP - 现代视频处理单元"; } else if (codecName.contains("mediacodec")) { return "GPU (罕见) - 图形处理器"; } else { return "Unknown"; } } private static void analyzePerformanceCharacteristics(MediaCodecInfo codecInfo) { try { if(codecInfo.getName().contains("c2.dolby.decoder.hevc")){ Log.i("硬解","===>" + codecInfo.getName() + " MediaCodec不支持杜比: codec does not support type"); return; } MediaCodecInfo.CodecCapabilities caps = codecInfo.getCapabilitiesForType("video/hevc"); if (caps != null) { MediaCodecInfo.VideoCapabilities videoCaps = caps.getVideoCapabilities(); assert videoCaps != null; Log.i("硬解", "===>支持最高分辨率: " + videoCaps.getSupportedWidths().getUpper() + "x" + videoCaps.getSupportedHeights().getUpper()); Log.i("硬解", "===>性能级别: " + (videoCaps.getSupportedWidths().getUpper() >= 7680 ? "8K Capable" : "4K/HDR Capable")); } } catch (Exception e) { Log.e("硬解", "===>分析出错: ", e); } }
http://www.jsqmd.com/news/104581/

相关文章:

  • 解锁免费内网穿透新姿势:“财运到”的便捷与高性能实践
  • 鸿蒙ArkTS与Vue3状态管理对比
  • EmotiVoice语音合成在语音占卜APP中的神秘感塑造
  • 聊聊免费内网穿透工具的一个选择
  • Nginx入门配置:10分钟搞定Web服务器
  • EmotiVoice能否生成辩论赛语音?逻辑性强语调输出
  • 12V 转 3.3V 双路输出电路过载保护规避方案(总功率 33W 场景)
  • EmotiVoice能否替代专业配音演员?行业专家这样说
  • Electron+Vite:实现electron + vue3 + ts + pinia + vite高效跨平台开发指南 - 指南
  • 【收藏必备】一文搞懂RAG技术栈:大模型应用开发者的实战宝典
  • 情感语音合成技术前沿:EmotiVoice背后的科研力量
  • No2.1 信息系统工程错题集
  • 【必学收藏】RAG检索增强生成技术详解:从入门到实战,提升大模型应用能力
  • EmotiVoice在直播场景的应用尝试:虚拟主播实时发声
  • 已解决 Python 的execjs 调用js 报错:UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\xf1‘ in position
  • ShardingSphere 启动报错 “Unknown table ‘keywords‘ in information_schema“ 完整解决方案
  • Android之全局异常捕获UncaughtExceptionHandler
  • 结合大模型与EmotiVoice:实现上下文感知的情感语音输出
  • 开源项目精选:不容错过的高质量TTS模型EmotiVoice
  • python基础学习之Python 循环及函数
  • dify v1.11.1 离线安装本地插件怎么报错了?!
  • EmotiVoice技术深度解析:为何它成为情感化语音合成的新标杆?
  • 从入门到精通:CTF比赛100个解题思路全攻略,网络安全必备收藏
  • 从零到全栈AI工程师:大模型应用开发必备技能与学习路径(建议收藏)
  • 27、端口敲门与单包授权技术解析
  • IBM SPSS Amos 29 结构方程建模利器,向复杂数据的统计解决下载安装激活步骤
  • Java RESTful 接口开发 核心指南
  • 程序员必备基础:10种常见安全漏洞浅析
  • 精度论文:【Class Attention Transfer Based Knowledge Distillation】
  • 31、可视化 iptables 日志与攻击欺骗分析