在多媒体应用开发中,视频解码格式的兼容性直接影响播放体验。HarmonyOS NEXT 6.1(API 23)对 AVCodec Kit 进行了重要升级,一次性新增了9大视频格式的软件解码支持,涵盖新兴高效编码 AV1、VP9、VP8,以及老旧历史格式 RV30、RV40、WVC1、DVVIDEO、RAWVIDEO、MPEG1。这一补齐让流媒体播放器和遗留资源重放不再因缺少专用解码芯片而失效,同时通过智能调度机制大幅降低开发者适配设备差异的工作量。
【软硬解码智能调度机制】
AVCodec Kit 在创建解码器时采用“硬件优先、软解兜底、能力拦截”的三层策略:首先通过 MIME 类型尝试创建硬件解码器;若硬件不支持或资源耗尽,自动回退到软件解码;若格式完全无对应解码能力,才返回失败。上层应用只需调用 OH_VideoDecoder_CreateByMime(),无需手动编写先硬解后软解的降级逻辑。API 23 新增的9种软解能力正是为第二层“软解兜底”充实了库,确保任何格式都能有解。
【NDK 层能力探针核心 API】
在 C/C++ 层,通过 native_avcodec_base.h 和 native_avcapability.h 提供的接口可精准探测系统解码底座:
- // 获取指定 MIME 的能力实例
- OH_AVCapability *capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AV1, true);
- // 检查是否硬件解码
- bool isHardWare = OH_AVCapability_IsHardware(capability);
- // 创建解码器实例
- OH_AVCodec *videoDec = OH_VideoDecoder_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO_AV1);
复制代码
开发者可基于此查询设备支持情况,决定是否启用额外转码或 fallback 方案。
【ArkTS 探针舱实现】
为了直观验证新增格式的软硬解调度,可以构建一个纯 UI 探针模拟展示舱。核心思路是在 ArkTS 层枚举 MIME 类型,通过模拟底层调用和随机概率演示调度结果(实际项目可对接 NDK 能力查询)。以下为简化版实现:
首页导视卡片:- import { router } from '@kit.ArkUI';
- @Entry
- @Component
- struct Index {
- build() {
- Column() {
- Text('AVCodec Kit 多媒体解码能力探针舱 · API 23 新增全格式软解覆盖')
- .fontSize(14).fontColor('#38BDF8');
- Text('1. 新增 AV1/VP9/VP8/RV30/RV40/WVC1/DVVIDEO/RAWVIDEO/MPEG1 软解\n' +
- '2. 软硬解智能调度:硬解优先,不满足则回退软解\n' +
- '3. 通过 MIME 创建解码器,无需手动降级')
- .fontSize(12).fontColor('#94A3B8');
- Button('📺 激活解码能力探针中控舱')
- .onClick(() => { router.pushUrl({ url: 'pages/AVCodecDemo' }); });
- }
- }
- }
复制代码
探针主舱页面:- @Entry
- @Component
- struct AVCodecDemo {
- @State log: string = '等待系统平台探针扫描...\n';
- @State codecList: { name: string; mime: string; isHardware: boolean; status: string }[] = [
- { name: 'AV1', mime: 'video/av01', isHardware: false, status: '等待扫描' },
- { name: 'VP9', mime: 'video/x-vnd.on2.vp9', isHardware: false, status: '等待扫描' },
- { name: 'VP8', mime: 'video/x-vnd.on2.vp8', isHardware: false, status: '等待扫描' },
- { name: 'RV30', mime: 'video/vnd.rn-realvideo', isHardware: false, status: '等待扫描' },
- { name: 'RV40', mime: 'video/vnd.rn-realvideo', isHardware: false, status: '等待扫描' },
- { name: 'WVC1', mime: 'video/x-ms-wmv', isHardware: false, status: '等待扫描' },
- { name: 'DVVIDEO', mime: 'video/x-dv', isHardware: false, status: '等待扫描' },
- { name: 'RAWVIDEO', mime: 'video/raw', isHardware: false, status: '等待扫描' },
- { name: 'MPEG1', mime: 'video/mpeg', isHardware: false, status: '等待扫描' },
- ];
- private async probeCodecCapabilities(): Promise<void> {
- // 模拟扫描过程,实际可调用 NDK OH_AVCodec_GetCapability
- for (let i = 0; i < this.codecList.length; i++) {
- // 假设约20%高端机型支持特定格式硬件解码
- let isHard = Math.random() > 0.8;
- this.codecList[i] = {
- ...this.codecList[i],
- isHardware: isHard,
- status: isHard ? '硬解优先 + 软解兜底' : '仅系统软件解码 (API 23)'
- };
- }
- }
- build() {
- Column() {
- Button(this.isScanning ? '探针扫描中...' : '启动全量 MIME 探针诊断')
- .onClick(() => { this.probeCodecCapabilities(); });
- ForEach(this.codecList, (item) => {
- Row() {
- Text(item.name + ' ' + item.mime);
- Text(item.status).fontColor(item.isHardware ? '#34D399' : '#F472B6');
- }
- })
- Text('探针诊断日志' + '\n' + this.log);
- }
- }
- }
复制代码
实际运行时,对于新增格式,多数设备会显示“仅系统软件解码 (API 23)”,少数支持硬件加速的机型则会提示“硬解优先 + 软解兜底”。日志区输出每次调度的类型判断。
【总结】
API 23 的软解码全覆盖和智能调度机制,使开发者无需关心设备硬件差异。只需规范使用 OH_AVCodec_GetCapability 探明底座规格,然后放心创建解码器,余下资源争抢或适配全由系统处理。对于流媒体应用和历史资源重放场景,这一升级显著提升了播放的稳定性和兼容性。 |