开源项目:OpenHarmony WMA音频解码器
OpenHarmony WMA音频解码器
项目概述
本项目是参加 OpenHarmony 多媒体编解码竞赛 的参赛作品,旨在为 OpenHarmony 平台开发一个完整的 WMA 音频解码器,支持 WMA V1/V2/PRO 格式解码,提供 NDK 接口和 ArkTS 应用层。
目前仓库还是私有状态,待比赛结束后会开放出来,有兴趣的朋友可以先加个关注或私聊。
竞赛要求
- 支持格式 : WMA V1/V2/PRO音频解码
- 平台要求 : OpenHarmony 5.0+ (API 15)
- 接口要求 : NDK接口支持,支持能力查询
- 输出要求 : PCM数据,播放声音正常
- 文档要求 : API参考、开发指南 #技术分享
项目特色
- 静态链接方案 : 避免动态加载问题,提升性能
- 完整技术栈 : FFmpeg + NDK + NAPI + ArkTS
- 模拟数据支持 : 提供真实音频体验的测试环境
- 详细文档 : 完整的API参考和开发指南
技术架构
整体架构(静态链接)
┌─────────────────────────────────────────────────────────────┐
│ OpenHarmony 应用 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ ArkTS 应用层 │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌──────────┐ │ │
│ │ │ 音频播放器 │ │ 文件管理器 │ │ 测试应用 │ │ │
│ │ └─────────────────┘ └─────────────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ NAPI 函数 (内置) │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ napi_wrapper_c.c │ │ │
│ │ │ o queryCapabilities() -
│ │ │ o createDecoder() -
│ │ │ o decode() -
│ │ │ o getInfo() -
│ │ │ o destroyDecoder() -
│ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ NDK 接口层 │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ │ │ oh_wma_decoder.cpp │ │ │ │ │ │ o OHWmaDecoder_Create() -
│ │ │ o OHWmaDecoder_Init() -
│ │ │ o OHWmaDecoder_Decode() -
│ │ │ o OHWmaDecoder_GetInfo() -
│ │ │ o OHWmaDecoder_Destroy() -
│ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 核心解码层 │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ │ │ wma_decoder_c.c │ │ │ │ │ │ o wma_decoder_create() -
│ │ │ o wma_decoder_init() -
│ │ │ o wma_decoder_decode() -
│ │ │ o wma_decoder_get_info() -
│ │ │ o wma_decoder_destroy() -
│ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ │ │ pcm_processor_c.c │ │ │ │ │ │ o PCM 缓冲区管理 │ │ │ │ │ │ o 音频格式转换 │ │ │ │ │ │ o 重采样处理 │ │ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 第三方库层 │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌──────────┐ │ │ │ │ │ libavcodec │ │ libavutil │ │libswresample│ │ │ │ │ │ (WMA 解码) │ │ (工具函数) │ │ (重采样) │ │ │ │ │ └─────────────────┘ └─────────────────┘ └──────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘
技术栈
- 平台 : OpenHarmony 5.0+ (API 15)
- 开发语言 : C/C++ (NDK层) + ArkTS (应用层)
- 核心解码库 : FFmpeg 6.1 (libavcodec)
- 音频框架 : OHAudio
- 接口桥接 : NAPI
- 构建工具 : OpenHarmony NDK + CMake
- 链接方式 : 静态链接
静态链接优势
- 避免动态加载问题 : 所有代码直接编译进应用
- 更好的性能 : 静态链接减少运行时开销
- 更简单的部署 : 单一可执行文件,减少依赖管理
- 编译时错误检查 : 在编译时就能发现错误
- 无运行时依赖 : 不依赖外部模块加载
开发路线
阶段一:基础架构搭建
- FFmpeg交叉编译 (OpenHarmony aarch64)
- 核心解码器实现 (C语言)
- NDK接口层设计
- NAPI桥接层实现
- 静态链接方案实施
阶段二:应用集成
- OpenHarmony应用创建
- ArkTS界面开发
- 模拟数据生成
- 功能测试验证
阶段三:真机验证
- 真机部署测试
- WMA文件解码验证
- 音频播放集成
- 性能优化
阶段四:完善优化
- 完整错误处理
- 性能基准测试
- 文档完善
- 示例应用
当前进展
已完成工作
1. FFmpeg交叉编译
- 成功交叉编译FFmpeg 6.1 for OpenHarmony aarch64
- 包含libavcodec、libavutil、libswresample
- 支持WMA V1/V2/PRO格式解码
2. C语言核心解码器
- 核心解码器: wma_decoder_c.c (8,718 字节)
- PCM处理器: pcm_processor_c.c
- 完整的WMA解码逻辑实现
3. NDK接口层
- NDK接口: oh_wma_decoder.cpp (15,436 字节)
- C++包装器,提供C风格API
- 完整的错误处理和资源管理
4. NAPI桥接层
- NAPI桥接: napi_wrapper_c.c (18,496 字节)
- 模块注册为 @ohos/wma-decoder
- 完整的函数导出和类型转换
5. 静态链接方案
- 修改CMakeLists.txt,直接编译所有源码
- 正确链接FFmpeg静态库
- 避免动态模块加载问题
- 所有代码编译进应用,无外部依赖
6. OpenHarmony应用集成
- 应用编译成功
- ArkTS代码编译成功
- UI界面正常工作
- 模拟模块提供完整功能测试
编译统计
- 总编译时间 : ~39秒
- ArkTS编译 : 成功
- C/C++编译 : 成功
- 链接 : 成功
- 应用启动 : 成功
运行效果
应用界面
- 应用正常启动
- 按钮交互正常
- 日志输出详细
- 测试结果显示
模拟解码器功能
- 生成真实的PCM音频数据(440Hz正弦波)
- 支持44.1kHz, 2声道, 16位音频格式
- 完整的解码器接口实现
- 错误处理和资源管理
运行日志示例
静态链接已完成,使用模拟模块进行测试
真实NAPI模块已编译进应用,等待运行时支持
解码器能力: {
"supportedFormats": 7,
"maxSampleRate": 48000,
"minSampleRate": 8000,
"maxChannels": 8,
"maxBitDepth": 32,
"minBitDepth": 8
}
解码器初始化成功,ID: 1
WMA解码器初始化成功,配置: {"sampleRate":44100,"channels":2,"bitDepth":16,"format":2}
解码成功: 1024字节, 44100Hz
运行条件
开发环境要求
- 操作系统 : macOS 12.0+ / Ubuntu 20.04+ / Windows 10+
- OpenHarmony SDK : 15.0+
- DevEco Studio : 4.0+
- NDK工具链 : OpenHarmony NDK 15.0+
- 内存 : 8GB+
- 存储 : 10GB+ 可用空间
运行环境要求
- 设备 : 支持OpenHarmony 5.0+的设备
- 架构 : ARM64 (aarch64)
- 内存 : 2GB+
- 存储 : 1GB+ 可用空间
各平台配置要点
macOS 配置要点(强烈建议使用mac)
1. 环境变量配置
export OHOS_NDK_HOME=/Users/你的用户名/Library/OpenHarmony/Sdk
echo $OHOS_NDK_HOME
2. 工具链检查
ls $OHOS_NDK_HOME/15/native/llvm/bin/clang
ls $OHOS_NDK_HOME/15/native/llvm/bin/
3. 常见问题
- 权限问题 : 确保DevEco Studio有足够权限访问SDK目录
- 路径问题 : macOS路径区分大小写,注意路径准确性
- 工具缺失 : 如果缺少wget,使用 brew install wget 或修改脚本使用curl
Ubuntu/Linux 配置要点
1. 依赖安装
sudo apt update
sudo apt install build-essential cmake git wget curl
sudo apt install openjdk-11-jdk
2. 环境变量配置
export OHOS_NDK_HOME=/opt/openharmony/sdk
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
source ~/.bashrc
3. 权限设置
chmod +x $OHOS_NDK_HOME/15/native/llvm/bin/*
Windows 配置要点
1. 环境变量设置
# 在系统环境变量中添加
OHOS_NDK_HOME=C:\Users\你的用户名\AppData\Local\OpenHarmony\Sdk JAVA_HOME=C:\Program Files\Java\jdk-11
# 添加到PATH
%OHOS_NDK_HOME%\15\native\llvm\bin
2. 工具链配置
- 使用Windows版本的OpenHarmony NDK
- 确保使用正确的路径分隔符(反斜杠)
- 在PowerShell或CMD中验证环境变量
3. 常见问题
- 路径长度 : Windows路径长度限制,避免过深的目录结构
- 权限问题 : 以管理员身份运行DevEco Studio
- 防火墙 : 确保构建脚本可以访问网络
通用配置检查
1. 环境验证脚本
#!/bin/bash
echo "=== OpenHarmony环境检查 ==="
if [ -z "$OHOS_NDK_HOME" ]; then echo " OHOS_NDK_HOME 未设置" exit 1 else echo " OHOS_NDK_HOME: $OHOS_NDK_HOME" fi
if [ ! -d "$OHOS_NDK_HOME" ]; then echo " SDK 目录不存在: $OHOS_NDK_HOME" exit 1 else echo " SDK 目录存在" fi
TOOLCHAIN="$OHOS_NDK_HOME/15/native/llvm/bin" if [ ! -f "$TOOLCHAIN/clang" ]; then echo " clang 编译器不存在" exit 1 else echo " clang 编译器存在" fi
if [ ! -f "$TOOLCHAIN/clang++" ]; then echo " clang++编译器不存在" exit 1 else echo " clang++编译器存在" fi
echo " 环境检查通过"
2. 构建前检查清单
- OpenHarmony SDK已正确安装
- 环境变量已正确设置
- 工具链文件存在且可执行
- 网络连接正常(用于下载FFmpeg)
- 磁盘空间充足(至少10GB)
- 权限设置正确
3. 故障排除
./start.sh check
./start.sh clean
export OHOS_NDK_HOME=/path/to/your/sdk
$OHOS_NDK_HOME/15/native/llvm/bin/clang --version
ls hmaudiodecoder/third_party/ffmpeg/lib/
./start.sh ffmpeg ./start.sh core ./start.sh app
运行说明
一键启动(推荐)
export OHOS_NDK_HOME=/path/to/OpenHarmony/Sdk
./start.sh
一键启动脚本功能 :
- 自动检查环境和项目结构
- 构建FFmpeg库(智能跳过已构建)
- 构建核心解码器和NDK接口
- 构建OpenHarmony应用
- 提供运行指导
脚本选项 :
./start.sh
./start.sh cleanall
./start.sh ffmpeg
./start.sh core
./start.sh app
./start.sh check
./start.sh clean
./start.sh help
手动构建(可选)
1. 环境配置
macOS/Linux:
export OHOS_NDK_HOME=/path/to/OpenHarmony/Sdk
echo $OHOS_NDK_HOME
Windows:
# 设置环境变量(在系统设置中或命令行中)
set OHOS_NDK_HOME=C:\path\to\OpenHarmony\Sdk
# 验证环境
echo %OHOS_NDK_HOME%
2. 项目构建
cd hmaudiodecoder
./shell/build_ffmpeg.sh
./shell/build_c_version.sh
3. 应用运行
hvigor build
08-30 02:43:56.629 54945-709429 A00000/testTag I Ability onCreate
08-30 02:43:56.636 54945-709429 A00000/testTag I Ability onWindowStageCreate
08-30 02:43:56.638 54945-709429 A00000/testTag I Ability onForeground
08-30 02:43:56.884 54945-709429 A00000/testTag I Succeeded in loading the content.
08-30 02:43:56.919 54945-709429 A03d00/JSAPP I 静态链接已完成,使用模拟模块进行测试
08-30 02:43:56.919 54945-709429 A03d00/JSAPP I 真实NAPI模块已编译进应用,等待运行时支持
08-30 02:43:56.923 54945-709429 A03d00/JSAPP I 解码器能力: {
08-30 02:43:56.923 54945-709429 A03d00/JSAPP I "supportedFormats": 7,
08-30 02:43:56.923 54945-709429 A03d00/JSAPP I "maxSampleRate": 48000,
08-30 02:43:56.923 54945-709429 A03d00/JSAPP I "minSampleRate": 8000,
08-30 02:43:56.923 54945-709429 A03d00/JSAPP I "maxChannels": 8,
08-30 02:43:56.923 54945-709429 A03d00/JSAPP I "maxBitDepth": 32,
08-30 02:43:56.923 54945-709429 A03d00/JSAPP I "minBitDepth": 8
08-30 02:43:56.923 54945-709429 A03d00/JSAPP I }
08-30 02:43:56.923 54945-709429 A03d00/JSAPP I 解码器初始化成功,ID: 1
08-30 02:43:56.923 54945-709429 A00000/testTag I WMA解码器初始化成功,配置: {"sampleRate":44100,"channels":2,"bitDepth":16,"format":2}
08-30 02:44:00.235 54945-709429 A00000/testTag I 解码成功: 1024字节, 44100Hz
08-30 02:44:39.775 55201-710772 A00000/testTag I Ability onCreate
08-30 02:44:39.776 55201-710772 A00000/testTag I Ability onWindowStageCreate
08-30 02:44:39.777 55201-710772 A00000/testTag I Ability onForeground
08-30 02:44:39.847 55201-710772 A00000/testTag I Succeeded in loading the content.
08-30 02:44:39.877 55201-710772 A03d00/JSAPP I 静态链接已完成,使用模拟模块进行测试
08-30 02:44:39.877 55201-710772 A03d00/JSAPP I 真实NAPI模块已编译进应用,等待运行时支持
08-30 02:44:39.878 55201-710772 A03d00/JSAPP I 解码器能力: {
08-30 02:44:39.878 55201-710772 A03d00/JSAPP I "supportedFormats": 7,
08-30 02:44:39.878 55201-710772 A03d00/JSAPP I "maxSampleRate": 48000,
08-30 02:44:39.878 55201-710772 A03d00/JSAPP I "minSampleRate": 8000,
08-30 02:44:39.878 55201-710772 A03d00/JSAPP I "maxChannels": 8,
08-30 02:44:39.878 55201-710772 A03d00/JSAPP I "maxBitDepth": 32,
08-30 02:44:39.878 55201-710772 A03d00/JSAPP I "minBitDepth": 8
08-30 02:44:39.878 55201-710772 A03d00/JSAPP I }
08-30 02:44:39.878 55201-710772 A03d00/JSAPP I 解码器初始化成功,ID: 1
08-30 02:44:39.878 55201-710772 A00000/testTag I WMA解码器初始化成功,配置: {"sampleRate":44100,"channels":2,"bitDepth":16,"format":2}
08-30 02:50:05.012 56903-719116 A00000/testTag I Ability onCreate
08-30 02:50:05.013 56903-719116 A00000/testTag I Ability onWindowStageCreate
08-30 02:50:05.014 56903-719116 A00000/testTag I Ability onForeground
08-30 02:50:05.097 56903-719116 A00000/testTag I Succeeded in loading the content.
08-30 02:50:05.101 56903-719116 A03d00/JSAPP I 静态链接已完成,使用模拟模块进行测试
08-30 02:50:05.101 56903-719116 A03d00/JSAPP I 真实NAPI模块已编译进应用,等待运行时支持
08-30 02:50:05.102 56903-719116 A03d00/JSAPP I 解码器能力: {
08-30 02:50:05.102 56903-719116 A03d00/JSAPP I "supportedFormats": 7,
08-30 02:50:05.102 56903-719116 A03d00/JSAPP I "maxSampleRate": 48000,
08-30 02:50:05.102 56903-719116 A03d00/JSAPP I "minSampleRate": 8000,
08-30 02:50:05.102 56903-719116 A03d00/JSAPP I "maxChannels": 8,
08-30 02:50:05.102 56903-719116 A03d00/JSAPP I "maxBitDepth": 32,
08-30 02:50:05.102 56903-719116 A03d00/JSAPP I "minBitDepth": 8
08-30 02:50:05.102 56903-719116 A03d00/JSAPP I }
08-30 02:50:05.102 56903-719116 A03d00/JSAPP I 解码器初始化成功,ID: 1
08-30 02:50:05.102 56903-719116 A00000/testTag I WMA解码器初始化成功,配置: {"sampleRate":44100,"channels":2,"bitDepth":16,"format":2}
4. 构建说明
shell/build_c_version.sh 脚本会自动构建以下组件:
- 核心解码器 : WMA解码器和PCM处理器
- NDK接口层 : C++包装器,提供C风格API
- NAPI桥接层 : NAPI包装器,连接ArkTS应用
- 静态库 : 生成所有必要的静态库文件
5. 功能测试
- 启动应用
- 点击"测试解码器"按钮
- 查看解码器能力信息
- 验证音频数据生成
- 检查日志输出
测试说明
模拟器测试
- 功能测试 : 解码器接口调用正常
- 数据测试 : PCM数据生成正确
- 格式测试 : 支持多种音频格式
- 错误处理 : 异常情况处理正常
真机测试(待完成)
- 部署测试 : 应用安装和启动
- 性能测试 : 内存和CPU使用情况
- 兼容性测试 : 不同设备适配
- 稳定性测试 : 长时间运行测试
测试用例
- 解码器能力查询
- 输入: 无
- 输出: 支持的格式、采样率范围等
- 预期: 返回完整的能力信息
- 解码器初始化
- 输入: 音频配置参数
- 输出: 解码器实例ID
- 预期: 成功创建解码器实例
- 音频数据解码
- 输入: WMA音频数据
- 输出: PCM音频数据
- 预期: 正确解码并输出PCM数据
待优化项
短期优化(1-2周)
- 真机验证
- 在真机上测试应用
- 验证NAPI函数调用
- 测试WMA文件解码功能
- WMA文件测试
- 准备测试用的WMA文件(V1/V2/PRO格式)
- 验证解码功能
- 测试音频输出质量
中期优化(1个月)
- 音频播放集成
- 集成OpenHarmony OHAudio框架
- 实现PCM数据实时播放
- 添加音频流控制(播放/暂停/停止)
- 性能优化
- 内存使用分析
- CPU占用测试
- 解码速度基准测试
长期优化(2-3个月)
- 完整功能
- 支持所有WMA格式
- 完整的错误处理
- 用户友好的界面
- 文档和示例
- API文档完善
- 使用示例
- 部署指南
项目结构
hm-audio-decoder/
├── start.sh
├── hmaudiodecoder/
│ ├── src/
│ │ ├── decoder/
│ │ │ ├── wma_decoder_c.c
│ │ │ ├── wma_decoder_c.h
│ │ │ ├── pcm_processor_c.c
│ │ │ └── pcm_processor_c.h
│ │ ├── ndk/
│ │ │ ├── oh_wma_decoder.cpp
│ │ │ └── oh_wma_decoder.h
│ │ └── napi/
│ │ └── napi_wrapper_c.c
│ ├── entry/
│ │ ├── src/main/
│ │ │ ├── cpp/
│ │ │ └── ets/
│ │ └── libs/ohos/aarch64/
│ ├── third_party/
│ │ ├── ffmpeg/
│ │ ├── ffmpeg-6.1/
│ │ ├── build_ohos/
│ │ └── install_ohos/
│ ├── shell/
│ │ ├── build_ffmpeg.sh
│ │ └── build_c_version.sh
│ ├── build/
│ │ ├── output/
│ │ ├── build_core/
│ │ ├── build_ndk/
│ │ └── build_napi/
│ ├── docs/
│ └── samples/
├── 运行效果/
├── 赛事相关说明/
└── 文档总入口.md
平台相关文件说明
构建脚本(需要根据平台调整)
- shell/build_ffmpeg.sh - FFmpeg交叉编译脚本
- shell/build_c_version.sh - C版本构建脚本
- 这些脚本中的路径分隔符和命令可能需要根据平台调整
编译产物(平台无关)
- entry/libs/ohos/aarch64/ - 所有编译产物都是ARM64架构
- 这些文件可以在任何支持OpenHarmony的设备上运行
开发工具(平台相关)
- macOS: 使用bash脚本,路径使用正斜杠
- Windows: 需要PowerShell或WSL,路径使用反斜杠
- Linux: 使用bash脚本,路径使用正斜杠
技术贡献
- FFmpeg项目 - 提供WMA解码核心库
- OpenHarmony项目 - 提供平台和开发工具
- DevEco Studio团队 - 提供开发环境
- DeepSeek - 提供开发技术路线指引
许可证
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
竞赛信息
- 竞赛名称 : OpenHarmony多媒体编解码竞赛
- 竞赛官网 : gitee.com/openharmony…
- 参赛作品 : WMA音频解码器
- 技术栈 : OpenHarmony + FFmpeg + NDK + NAPI
- 项目状态 : 基础架构完成,功能测试通过
--- 项目版本 : v1.0 最后更新 : 2025年08月30日 维护者 : hfqf123@126.com 项目 : OpenHarmony WMA 音频解码器