鸿蒙视频解码

%% 鸿蒙 AVCodec Kit -- 视频解码全景图 %% 开发者:Kimi 2024-08-16 %% 说明:一张图读懂"如何调用 Native API 完成视频解码" flowchart TD subgraph 应用侧 A([应用]) -->|1. 创建| B[OH_VideoDecoder_CreateByMime] A -->|2. 注册回调| C[OH_VideoDecoder_RegisterCallback] A -->|3. 配置| D[OH_VideoDecoder_Configure] A -->|4. 设 Surface| E[OH_VideoDecoder_SetSurface]:::surface A -->|5. 就绪| F[OH_VideoDecoder_Prepare] A -->|6. 启动| G[OH_VideoDecoder_Start] end subgraph 输入线程 H([码流线程]) -->|7. 送入| I[OH_VideoDecoder_PushInputBuffer] I -->|携带 SPS/PPS| J{{AnnexB 格式}} end subgraph 解码内核 K([解码器]) -->|8. 解码| L[YUV Frame] K -->|事件| M>回调] M -->|OnNeedInputBuffer| N[继续送码流] M -->|OnNewOutputBuffer| O[拿到输出 buffer] M -->|OnStreamChanged| P[分辨率变化] M -->|OnError| Q[错误处理] end subgraph 输出线程 direction TB R([渲染线程]) -->|9a. Surface 送显| S[OH_VideoDecoder_RenderOutputBuffer]:::surface R -->|9b. 丢弃帧| T[OH_VideoDecoder_FreeOutputBuffer] R -->|9c. Buffer 保存| U[写 YUV 文件] style U fill:#f9f,stroke:#333 end subgraph 生命周期 V([Flush]) -->|清缓存| W[重新 Start] X([Reset]) -->|回初始态| Y[重新 Configure] Z([Stop]) -->|暂停| G AA([Destroy]) -->|释放| BB([Released]) end %% 状态机泳道 subgraph 状态机 direction LR I1((Initialized)) -->|Configure| C1((Configured)) C1 -->|Prepare| P1((Prepared)) P1 -->|Start| E1((Executing)) E1 -->|Flush| F1((Flushed)) E1 -->|EOS| EOS((End-of-Stream)) E1 -->|Error| ERR((Error)) ERR -->|Reset| I1 ERR -->|Destroy| R1((Released)) end %% 样式 classDef surface fill:#c2e0c6,stroke:#006100 classDef buffer fill:#fce8b4,stroke:#8f7f00 classDef life fill:#d5e8d4,stroke:#82b366

核心 API 设计速查表

阶段 关键函数 说明
创建 OH_VideoDecoder_CreateByMime()/ CreateByName() 按指定格式(MIME类型)或解码器名称创建解码器实例
配置 OH_VideoDecoder_Configure() 设置视频宽高、色彩空间、低时延模式等核心参数
绑定 OH_VideoDecoder_SetSurface() 关联 OHNativeWindow(通常来自XComponent或OpenGL渲染表面)
就绪 OH_VideoDecoder_Prepare() 内部预分配编解码资源,完成初始化准备
启动 OH_VideoDecoder_Start() 启动解码器,进入运行(Running)状态
送码流 OH_VideoDecoder_PushInputBuffer() 输入AnnexB格式的码流数据,需整帧一次性送入
取帧 OH_VideoDecoder_RenderOutputBuffer() 将解码帧送入绑定的Surface进行渲染(Surface模式)
OH_VideoDecoder_FreeOutputBuffer() 释放内存或存储YUV数据(Buffer模式)
生命周期 OH_VideoDecoder_Flush() 清空缓存中的输入/输出数据
OH_VideoDecoder_Reset() 重置解码器至初始状态
OH_VideoDecoder_Stop() 暂停解码操作,保留资源配置
OH_VideoDecoder_Destroy() 彻底释放解码器实例资源

模式差异一句话

  • Surface 模式:直接送显,性能高;支持动态切换 Surface;支持 DRM 安全通路。
  • Buffer 模式:拿到共享内存 YUV,可二次处理;仅非安全通路;需手动拷贝对齐数据。

常见坑提示

  1. Flush/Reset/Stop 后需重新送 SPS/PPS。
  2. Destroy 不能在回调线程里调。
  3. Buffer 模式必须 FreeOutputBuffer,否则阻塞后续输出。
  4. 多解码器共用同一 NativeWindow 时,先释放再启动,避免画面卡死。
相关推荐
nashane13 小时前
HarmonyOS 6学习:CapsLock键失效诊断与长截图完整实现指南
学习·华为·harmonyos
richard_yuu15 小时前
鸿蒙心理测评模块实战|PHQ-9/GAD7双量表答题、实时计分与结果本地化存储
华为·harmonyos
不爱吃糖的程序媛18 小时前
2026年Electron 鸿蒙PC环境搭建指南
人工智能·华为·harmonyos
nashane18 小时前
HarmonyOS 6学习:长截图功能开发中的滚动拼接与权限处理实战
人工智能·华为·harmonyos
大师兄666819 小时前
从零开发一个 HarmonyOS 输入法——KikaInputMethod 完整拆解
harmonyos·服务卡片·harmonyos6·formkit
Python私教1 天前
鸿蒙 NEXT 也能接 MCP?用 ArkTS 跑通 AI Agent 工具链
人工智能·华为·harmonyos
Swift社区1 天前
分布式能力在鸿蒙 PC 上到底怎么用?
分布式·华为·harmonyos
nashane2 天前
HarmonyOS 6学习:外接键盘CapsLock与长截图功能的实战调试与完整解决方案
学习·华为·计算机外设·harmonyos
aqi002 天前
一文理清 HarmonyOS 6.0.2 涵盖的十个升级点
android·华为·harmonyos·鸿蒙·harmony