HarmonyOS鸿蒙Next中PCM数据转AMR,PCM数据转OPUS,NDK如何实现?

HarmonyOS鸿蒙Next中PCM数据转AMR,PCM数据转OPUS,NDK如何实现? 聊天功能里发送语音功能,获取到pcm数据之后,需要编码为amr或者opus数据,各位能否提供可以运行代码,此功能影响了项目进度。

4 回复

音频编码看一下:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/audio-encoding-V5#开发指导

音频编解码和你说的在安卓上的开发流程基本一致,关于so问题,安卓编译的so没办法在鸿蒙上使用,如果有源码可以通过交叉编译的方式导出so,在鸿蒙native侧引入。音视频编解码推荐使用官方文档提供的方式。

交叉编译参考链接:https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/lycium/doc/app_calls_third_lib.md

音视频编解码参考链接:https://gitee.com/openharmony/multimedia_av_codec/tree/master/test/nativedemo/audio_demo

更多关于HarmonyOS鸿蒙Next中PCM数据转AMR,PCM数据转OPUS,NDK如何实现?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我按照指导转换后的amr在鸿蒙系统上可以播放,在ios和android系统上无法识别,有什么解决办法吗?

在HarmonyOS鸿蒙Next中,PCM数据转AMR和PCM数据转OPUS可以通过NDK实现。首先,需要使用NDK编译相关的音频编码库,如libopencore-amr或libopus。编译完成后,将生成的动态库集成到鸿蒙应用中。

对于PCM转AMR,可以使用libopencore-amr库。首先初始化编码器,设置采样率、比特率等参数,然后调用编码函数将PCM数据转换为AMR格式。编码完成后,释放编码器资源。

对于PCM转OPUS,可以使用libopus库。同样需要初始化编码器,设置采样率、声道数等参数,然后调用编码函数将PCM数据转换为OPUS格式。编码完成后,释放编码器资源。

在鸿蒙应用中,通过NDK调用这些库的函数,完成PCM到AMR和OPUS的转换。具体实现可以参考相关库的API文档和示例代码。确保在编译时正确链接这些库,并在运行时加载它们。

在HarmonyOS鸿蒙Next中,使用NDK实现PCM数据转AMR和OPUS,可以通过以下步骤:

  1. PCM转AMR:

    • 使用开源库如opencore-amr,通过NDK编译为.so库。
    • 在C++代码中调用Encoder接口,将PCM数据编码为AMR格式。
    • 示例代码:
      #include "amrnb/enc_if.h"
      void pcmToAmr(short* pcmData, int pcmSize, unsigned char* amrData) {
          void* encoder = Encoder_Interface_init(0);
          Encoder_Interface_Encode(encoder, MR122, pcmData, amrData, 0);
          Encoder_Interface_exit(encoder);
      }
      
  2. PCM转OPUS:

    • 使用开源库libopus,通过NDK编译为.so库。
    • 在C++代码中调用opus_encode接口,将PCM数据编码为OPUS格式。
    • 示例代码:
      #include "opus.h"
      void pcmToOpus(short* pcmData, int pcmSize, unsigned char* opusData) {
          OpusEncoder* encoder = opus_encoder_create(48000, 1, OPUS_APPLICATION_VOIP, NULL);
          opus_encode(encoder, pcmData, pcmSize / 2, opusData, pcmSize);
          opus_encoder_destroy(encoder);
      }
      
  3. NDK集成:

    • CMakeLists.txt中添加库路径和链接库。
    • 在Java层通过System.loadLibrary加载编译好的.so库,并通过JNI调用C++函数。

通过这些步骤,你可以在HarmonyOS鸿蒙Next中实现PCM数据转AMR和OPUS的音频编码。

回到顶部