写点什么

一起玩转 LiteOS 组件:Opus

  • 2022 年 1 月 18 日
  • 本文字数:2927 字

    阅读完需:约 10 分钟

摘要:Opus 编码器是一个开源的有损声音编码格式,适用于网络实时声音传输,标准格式为 RFC 6716,相对于其他编码格式来说,保真性更好。

 

本文分享自华为云社区《LiteOS组件尝鲜—玩转Opus》,作者: Lionlace。

Opus 基本介绍

 

Opus 编码器是一个开源的有损声音编码格式,适用于网络实时声音传输,标准格式为 RFC 6716,相对于其他编码格式来说,保真性更好。

Opus 接口介绍

 

本文档介绍一些 Opus 的常用接口,更多详细接口介绍请参考 components/media/opus/opus-1.3.1/include/opus.h 文件。

 

Opus 解码的过程是将 opus 格式转换为 pcm 格式,编码的过程是将 pcm 格式转换为 opus 格式。

解码

​创建解码器

 

OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create(opus_int32 Fs,int channels,int *error);
复制代码

 

解码器配置

 

OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...)OPUS_ARG_NONNULL(1);
复制代码

 

解码

 

OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode(OpusDecoder *st,const unsigned char *data,opus_int32 len,opus_int16 *pcm,int frame_size,int decode_fec) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
复制代码

 

删除解码器

 

OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st);
复制代码

编码

 

创建编码器

 

OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create(opus_int32 Fs,int channels,int application,int *error);
复制代码

 

编码器配置

 

OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...)OPUS_ARG_NONNULL(1);
复制代码

 

编码

 

OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode(OpusEncoder *st,const opus_int16 *pcm,int frame_size,unsigned char *data,opus_int32 max_data_bytes) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
复制代码

 

删除编码器

 

OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st);
复制代码

Opus 编解码中常用参数

 

sampling rate 采样率,在 opus 中只能取值为 8000,12000,16000,24000,48000,单位为赫兹(HZ)。

 

channel 声道,channel = 1 为单声道,channel = 2 为立体声。

 

frame size 帧大小,在 opus 中每帧的时间取值为 2.5,5,10,20,40,60,80,100,120。单位毫秒(ms)。单通道的帧大小 = 采样率 * 帧时间(单位为秒)。

 

其他详情参考音频编码:https://gitee.com/linktarget=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E9%259F%25B3%25E9%25A2%2591%25E7%25BC%2596%25E7%25A0%2581%2F1729208%3Ffr%3Daladdin

Opus Demo 解析

 

LiteOS 社区提供了 OpusDemoTask 示例程序来演示如何使用 opus,该 Demo 可以运行在 LiteOS 所支持的多块开发板上。本 Demo 以解码为例,其中 inputBuf 为采用 opus 格式编码的一段数据,对该数据进行解码处理,并将解码后数据以 pcm 格式保存到 outputBuf。

使能 Opus Demo

 

在 LiteOS 源码根目录下根据实际使用的开发板,拷贝 tools/build/config/目录下的默认配置文件 ${platform}.config 到根目录,并重命名为.config。

 

继续在LiteOS源码根目录下执行make menuconfig命令,按如下菜单路径使能Opus Demo。Demos --->Media Demo --->[*] Enable Opus Demo
复制代码

 

使能 Opus Demo 后会自动使能 Opus 组件。

 

保存退出后,LiteOS 会从 github 上自动下载 opus 源代码,并从 gitee 上下载适配于 LiteOS 系统的 patch 包,并打入 patch。关于组件下载的详细流程请参考:https://gitee.com/LiteOS/LiteOS_Components#%E5%9C%A8%E7%BA%BF%E7%BB%84%E4%BB%B6%E4%B8%8B%E8%BD%BD%E6%B5%81%E7%A8%8B

注:要成功下载相关资源,需要 Linux 主机可访问互联网,并安装 git 工具。

编译运行 Opus Demo

 

使能 Opus Demo 后,在 LiteOS 源码根目录下执行 make clean; make -j 命令编译 LiteOS 工程,编译成功后会在 out/{platform}/lib 路径下生成 libopus.a 和 libopus_demo.a 文件,系统镜像文件为 Huawei_LiteOS.bin。

 

以 realview-pbx-a9 为例,运行 OpusDemoTask。

 

其他开发板操作请参考快速入门:https://gitee.com/LiteOS/LiteOS/blob/master/doc/LiteOS_Quick_Start.md

 

执行结果如下:

 

********Hello Huawei LiteOS********LiteOS Kernel Version : 5.0.0Processor : Cortex-A9 * 4Run Mode : SMPGIC Rev : GICv1build time : Dec 25 2021 22:52:50**********************************main core booting up...osAppInitreleasing 3 secondary corescpu 0 entering schedulercpu 2 entering schedulercpu 3 entering schedulercpu 1 entering schedulerapp init!Hello, welcome to liteos demo!Opus demo task start to run.Opus demo input data:0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0xe0Opus demo output data:0x0000 0xfffd 0xfff4 0xffda 0xffaa 0xff88 0xff55 0xff03 0xff14 0xff83 0xffb4 0x001f 0x0070 0x01bb 0x024b 0x0274 0x02be 0x032a 0x0299 0x02a8 0x039c 0x05ef 0x0605 0x04fa 0x03d9 0x02b6 0x01d1 0x0113 0x0079 0xffd8 0x001d 0x000d 0xffdf 0xffbb 0xffac 0xffa0 0xff64 0xffc4 0xfff5 0xffee 0xffeb 0x006c 0x005e 0x0044 0x0045 0x02dc 0x0472 0x00db 0xff85 0x0347 0xfdc4 0xf957 0xf7c1 0xf62b 0xf3aa 0xf817 0xfb18 0xfcee 0x01b1 0x079e 0x059d 0x0aa0 0x0608 0x01c6 0xfdaf 0xfdda 0xfa18 0xf6d6 0xf701 0xfc43 0x0186 0x0387 0x0975 0xbb78 0xd771 0xd143 0xbc64 0xbcb9 0xe7f9 0xfd99 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000Opus demo decode seccussfully.Opus demo task finished.Huawei LiteOS #
复制代码

 

结语

 

未来我们还会持续新增更多组件、开发板、架构、特性等。

 

感谢您的阅读,有任何问题、建议,都可以留言给我们,让我们一起进步:https://gitee.com/LiteOS/LiteOS/issues

 

为了更容易找到“LiteOS”代码仓,建议访问https://gitee.com/LiteOS/LiteOS,关注“ Watch”、点赞“Star”、并“Fork”到自己账号下,如下图。

 

 

点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
一起玩转LiteOS组件:Opus