【OpenHarmony/HarmonyOs 】CheckMe 媒体能力检测实践:Audio Kit、编解码能力与影音场景适配

本文基于 CheckMe 项目,聚焦 HarmonyOS 媒体能力:音频播放、录音采集、图片格式、视频编解码和流媒体协议。前面已经写过“禁止 AI 识图”和“端侧 AI”,这篇只讲媒体能力检测和影音场景适配,不重复 AI 隐私和模型推理。

很多设备工具类应用只关注 CPU、内存、电池,但对用户来说,影音能力同样重要:

  • 设备是否支持高分辨率视频
  • 是否支持 H.265、AV1 等编码
  • 是否支持 FLAC、Opus 等音频格式
  • 图片是否支持 HEIF / WebP
  • 流媒体协议是否覆盖 HLS、DASH、RTSP
  • 扬声器和麦克风是否能正常工作

CheckMe 专门做了媒体能力页面和硬件音频检测逻辑。这个方向非常适合写成 HarmonyOS 新特性和系统能力实践文章。🎬🎵


一、媒体能力页做了什么

CheckMe 的媒体能力页面分为四类:

  • 视频编解码
  • 音频编解码
  • 图片格式
  • 流媒体协议

页面状态定义如下:

@State videoCodecs: MediaCapability[] = [];
@State audioCodecs: MediaCapability[] = [];
@State imageFormats: MediaCapability[] = [];
@State streamingProtocols: MediaCapability[] = [];
@State audioDetails: AudioFormatSupport[] = [];
@State mediaSummary: MediaSummary | null = null;
@State selectedTab: string = 'video';

这样页面可以按 Tab 展示不同能力,而不是把所有格式堆在一个长列表中。


二、MediaService:把能力数据集中管理

项目中有一个 MediaService,专门负责整理媒体能力:

export class MediaService {
  private static instance: MediaService;

  public static getInstance(): MediaService {
    if (MediaService.instance == null) {
      MediaService.instance = new MediaService();
    }
    return MediaService.instance;
  }

  public getAllMediaCapabilities(): MediaCapability[] {
    const capabilities: MediaCapability[] = [];
    capabilities.push(...this.getVideoCodecCapabilities());
    capabilities.push(...this.getAudioCodecCapabilities());
    return capabilities;
  }
}

这种写法有两个优点:

  • 页面只负责展示,不关心能力列表怎么组织
  • 后续替换为真实系统查询 API 时,页面层不用大改

在 CSDN 文章里,这种“服务层 + 页面层”的组织方式很值得强调,因为它比直接在页面里写数组更工程化。


三、视频编解码能力:从 H.264 到 AV1

项目中定义了多种视频能力:

private getVideoCodecCapabilities(): MediaCapability[] {
  return [
    {
      capabilityId: 'video_h264',
      capabilityName: 'H.264 (AVC)',
      supportedFormats: ['mp4', 'mkv', 'avi', 'mov', 'webm'],
      maxResolution: '4096x4096 @120fps',
      isSupported: true,
      codecInfo: '硬件解码支持'
    },
    {
      capabilityId: 'video_h265',
      capabilityName: 'H.265 (HEVC)',
      supportedFormats: ['mp4', 'mkv', 'webm'],
      maxResolution: '8192x4320 @60fps',
      isSupported: true,
      codecInfo: '硬件解码支持'
    },
    {
      capabilityId: 'video_av1',
      capabilityName: 'AV1',
      supportedFormats: ['mp4', 'mkv', 'webm'],
      maxResolution: '7680x4320 @60fps',
      isSupported: true,
      codecInfo: '硬件解码支持'
    }
  ];
}

这些能力可以对应真实使用场景:

  • H.264:兼容性好,适合通用播放
  • H.265:压缩率更高,适合高清视频
  • AV1:适合新一代高压缩视频
  • VP8 / VP9:适合 WebM 和部分流媒体场景

设备工具类应用展示这些信息,可以帮助用户判断设备影音能力。


四、音频编解码能力:Hi-Res、无损和环绕声

音频能力包括 AAC、MP3、FLAC、WAV、Opus、AC3、DTS 等:

private getAudioCodecCapabilities(): MediaCapability[] {
  return [
    {
      capabilityId: 'audio_flac',
      capabilityName: 'FLAC (无损)',
      supportedFormats: ['flac', 'fla'],
      maxResolution: '24bit/192kHz',
      isSupported: true,
      codecInfo: '硬件解码支持'
    },
    {
      capabilityId: 'audio_opus',
      capabilityName: 'Opus',
      supportedFormats: ['opus', 'ogg'],
      maxResolution: '510kbps',
      isSupported: true,
      codecInfo: '硬件解码支持'
    },
    {
      capabilityId: 'audio_dts',
      capabilityName: 'DTS',
      supportedFormats: ['dts', 'dtshd'],
      maxResolution: '7.1声道',
      isSupported: true,
      codecInfo: '软件解码支持'
    }
  ];
}

这里可以写出文章亮点:

  • FLAC / WAV:强调无损和高采样率
  • Opus:强调低延迟和高压缩效率
  • AC3 / DTS:强调家庭影音和环绕声

CheckMe 不只是列格式,而是给出了最大规格和支持方式,这比普通“格式列表”更有信息量。


五、图片格式:媒体能力不等于 AI 识图

项目支持的图片格式包括:

public getSupportedImageFormats(): MediaCapability[] {
  return [
    {
      capabilityId: 'image_jpeg',
      capabilityName: 'JPEG',
      supportedFormats: ['jpg', 'jpeg'],
      maxResolution: '16384x16384',
      isSupported: true,
      codecInfo: 'EXIF 支持'
    },
    {
      capabilityId: 'image_webp',
      capabilityName: 'WebP',
      supportedFormats: ['webp'],
      maxResolution: '16384x16384',
      isSupported: true,
      codecInfo: '有损/无损/动图'
    },
    {
      capabilityId: 'image_heif',
      capabilityName: 'HEIF / HEIC',
      supportedFormats: ['heif', 'heic'],
      maxResolution: '16384x16384',
      isSupported: true,
      codecInfo: '高效压缩'
    }
  ];
}

这里要特别说明:图片格式能力检测不等于读取用户相册,也不等于 AI 识图。

CheckMe 做的是:

  • 展示设备支持哪些图片格式
  • 展示格式最大规格
  • 展示是否支持透明通道、动图、高效压缩

它不做:

  • 不读取用户图片
  • 不上传图片
  • 不做人脸或物体识别

这能体现项目在媒体能力和隐私边界之间的平衡。


六、流媒体协议:面向真实影音场景

项目还定义了流媒体协议:

public getStreamingProtocols(): MediaCapability[] {
  return [
    {
      capabilityId: 'stream_http',
      capabilityName: 'HTTP/HTTPS',
      supportedFormats: ['MP4', 'M3U8', 'MKV'],
      maxResolution: '4K',
      isSupported: true,
      codecInfo: 'HTTP Live Streaming (HLS)'
    },
    {
      capabilityId: 'stream_dash',
      capabilityName: 'DASH',
      supportedFormats: ['MP4', 'WebM'],
      maxResolution: '4K',
      isSupported: true,
      codecInfo: '动态自适应流'
    }
  ];
}

这部分可以对应到用户场景:

  • 在线视频播放
  • 直播流播放
  • 局域网视频流
  • 自适应清晰度切换
  • 大屏投放前能力检测

如果后续扩展,可以结合网络状态给出建议:

interface PlaybackAdvice {
  recommendResolution: string;
  recommendCodec: string;
  reason: string;
}

比如网络延迟较高时建议降低码率,电量低时建议关闭高帧率播放。


七、媒体能力摘要:让用户一眼看懂

项目中通过 getMediaSummary() 汇总能力数量:

public getMediaSummary(): {
  totalCodecs: number;
  videoCodecs: number;
  audioCodecs: number;
  imageFormats: number;
  streamingProtocols: number;
} {
  const allCaps: MediaCapability[] = this.getAllMediaCapabilities();
  const imageCaps: MediaCapability[] = this.getSupportedImageFormats();
  const streamCaps: MediaCapability[] = this.getStreamingProtocols();

  return {
    totalCodecs: allCaps.length,
    videoCodecs: allCaps.filter((c: MediaCapability) =>
      c.supportedFormats.some((f: string) =>
        ['mp4', 'mkv', 'avi', 'mov', 'webm', 'mpg', 'vob', 'ts'].includes(f)
      )
    ).length,
    audioCodecs: allCaps.filter((c: MediaCapability) =>
      c.supportedFormats.some((f: string) =>
        ['m4a', 'mp4', 'mp3', 'flac', 'wav', 'ogg', 'opus', 'ac3', 'dts'].includes(f)
      )
    ).length,
    imageFormats: imageCaps.length,
    streamingProtocols: streamCaps.length
  };
}

页面中展示为:

  • 编解码器总数
  • 图片格式数量
  • 流媒体协议数量
  • 音频质量标签

这种摘要设计非常适合 CSDN 文章讲解:底层数据很多,但展示要聚合成用户能理解的指标。


八、媒体页面 UI:用 Tab 降低信息压力

媒体页用 selectedTab 控制内容切换:

if (this.selectedTab === 'video') {
  this.VideoCodecSection();
} else if (this.selectedTab === 'audio') {
  this.AudioCodecSection();
} else if (this.selectedTab === 'image') {
  this.ImageFormatSection();
} else if (this.selectedTab === 'stream') {
  this.StreamingSection();
}

Tab 包括:

this.TabButton('🎬 视频', 'video');
this.TabButton('🎵 音频', 'audio');
this.TabButton('🖼️ 图片', 'image');
this.TabButton('📡 流媒体', 'stream');

这比一个大列表更适合媒体能力页,因为用户通常是按场景查看:

  • 想看视频能力
  • 想看音频能力
  • 想看图片格式
  • 想看流媒体协议

UI 设计上,分类比堆叠更重要。


九、和 Audio Kit 硬件检测结合

媒体能力页展示“支持什么”,硬件检测页验证“能不能正常工作”。

在硬件检测中:

  • AudioRenderer 用于扬声器播放测试
  • AudioCapturer 用于麦克风采集测试

这两者和媒体能力页形成闭环:

MediaService:设备支持哪些格式
HardwareTest:音频输入输出是否正常

用户既能知道设备理论上支持什么,也能验证当前硬件是否能用。

这就是工具类应用的完整体验。


十、文章小结

CheckMe 的媒体能力检测实践可以总结为:

  • MediaService 集中管理能力数据
  • MediaCapability 统一视频、音频、图片、流媒体结构
  • 用 Tab 降低信息密度
  • 用摘要卡片快速展示能力概况
  • 用 Audio Kit 验证扬声器和麦克风硬件状态
  • 明确区分“格式能力检测”和“AI 识图”

这个方向非常适合体现 HarmonyOS 的影音系统能力,也适合扩展到播放器、直播工具、媒体诊断工具等项目中。

最后一句总结:媒体能力检测不是简单列格式,而是帮助用户理解这台设备适合怎样的影音场景。 🎧


参考资料

img

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐