一个爱技术的人
2342
- 收藏
- 点赞
- 分享
- 举报
海思HI3520D解码RTP音频
本帖最后由 wfjdemmye 于 2018-12-21 01:09 编辑
一,解决问题的思路
在遇到音频流的时候,不管是什么格式的音频数据(PCMA,PCMU,AAC,MP4,等,格式很多。)
首先应该是了解音频格式的数据在RTSP或者文件中,或者在其它地方的格式。
本文以在RTSP中为例子,解析出完整的过程。希望能偶然帮到一些同学。
二,海思支持的音频格式
以HI3520D为例子:mpp提供了对G711,G726,ADPCM的音频格式支持。并且支持原始音频文件(LPCM)的播放和录制。
那么针对RTSP出来的PCMA/PCMU/AAC/MP3都需要软解成原始音频格式(PCM)才能放到海思Mpp提供的接口中。
程序的大概思路就是如此了。
三,RTP中获取音频数据
以AAC为例子,通常aac有LATM和ADTS格式传输或者存储。RTP中是以LATM格式存在的,而一般的解码接口是以adts格式的数据解码的,所以需要一个包的重组。
1,从RTP中获取SDP数据
从RTSP的服务端出来SDP的信息解析
(,wireshark设置好过滤规则,用VLC演示播放流程,获取交互的包)
如上有用的字段:
通过VLC查看的编码信息与SDP获得的信息可能不一致,实际按SDP的信息来初始化AAC或者封装AAC成音频文件。
如上关键数据是配置将LATM转化成ADTS的重要材料。
四,海思音频部分的接口解析与使用
采样点数是解码之后输入到HI_S32 HI_MPI_ADEC_SendStream的数据的字节数据的1/2
举例:PCM 8K 单通道配置
typedef struct hiAIO_ATTR_S
{
AUDIO_SAMPLE_RATE_E enSamplerate; /*sample rate*/
AUDIO_BIT_WIDTH_E enBitwidth; /*bitwidth*/
AIO_MODE_E enWorkmode; /*master or slave mode*/
AUDIO_SOUND_MODE_E enSoundmode; /*momo or steror*/
HI_U32 u32EXFlag; /*expand 8bit to 16bit */
HI_U32 u32FrmNum; /*frame num in buffer*/
HI_U32 u32PtNumPerFrm; /*number of samples*/
HI_U32 u32ChnCnt;
HI_U32 u32ClkSel;
}AIO_ATTR_S
u32PtNumPerFrm = 160;
AUDIO_SOUND_MODE_E =momo ;
PCM 16K 双通道 16bit
u32PtNumPerFrm = 2048;
AUDIO_SOUND_MODE_E =momo ;
依次类推。。。
当数据变大之后,音频解码器播放PCM可能出现间歇式阻塞的情况,
这时间需要使用HI_MPI_ADEC_ClearChnBuf和HI_MPI_AO_ClearChnBuf及时去清空缓存。
一,解决问题的思路
在遇到音频流的时候,不管是什么格式的音频数据(PCMA,PCMU,AAC,MP4,等,格式很多。)
首先应该是了解音频格式的数据在RTSP或者文件中,或者在其它地方的格式。
本文以在RTSP中为例子,解析出完整的过程。希望能偶然帮到一些同学。
二,海思支持的音频格式
以HI3520D为例子:mpp提供了对G711,G726,ADPCM的音频格式支持。并且支持原始音频文件(LPCM)的播放和录制。
那么针对RTSP出来的PCMA/PCMU/AAC/MP3都需要软解成原始音频格式(PCM)才能放到海思Mpp提供的接口中。
程序的大概思路就是如此了。
三,RTP中获取音频数据
以AAC为例子,通常aac有LATM和ADTS格式传输或者存储。RTP中是以LATM格式存在的,而一般的解码接口是以adts格式的数据解码的,所以需要一个包的重组。
1,从RTP中获取SDP数据
从RTSP的服务端出来SDP的信息解析
(,wireshark设置好过滤规则,用VLC演示播放流程,获取交互的包)
如上有用的字段:
通过VLC查看的编码信息与SDP获得的信息可能不一致,实际按SDP的信息来初始化AAC或者封装AAC成音频文件。
如上关键数据是配置将LATM转化成ADTS的重要材料。
四,海思音频部分的接口解析与使用
采样点数是解码之后输入到HI_S32 HI_MPI_ADEC_SendStream的数据的字节数据的1/2
举例:PCM 8K 单通道配置
typedef struct hiAIO_ATTR_S
{
AUDIO_SAMPLE_RATE_E enSamplerate; /*sample rate*/
AUDIO_BIT_WIDTH_E enBitwidth; /*bitwidth*/
AIO_MODE_E enWorkmode; /*master or slave mode*/
AUDIO_SOUND_MODE_E enSoundmode; /*momo or steror*/
HI_U32 u32EXFlag; /*expand 8bit to 16bit */
HI_U32 u32FrmNum; /*frame num in buffer*/
HI_U32 u32PtNumPerFrm; /*number of samples*/
HI_U32 u32ChnCnt;
HI_U32 u32ClkSel;
}AIO_ATTR_S
u32PtNumPerFrm = 160;
AUDIO_SOUND_MODE_E =momo ;
PCM 16K 双通道 16bit
u32PtNumPerFrm = 2048;
AUDIO_SOUND_MODE_E =momo ;
依次类推。。。
当数据变大之后,音频解码器播放PCM可能出现间歇式阻塞的情况,
这时间需要使用HI_MPI_ADEC_ClearChnBuf和HI_MPI_AO_ClearChnBuf及时去清空缓存。
文件: g711.zip
下载
文件: pcm-g711a-capture-play-release.zip
下载
文件: pcm-capture-play.zip
下载
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2016-04-16 17:53:27
-
2015-11-02 10:35:09
-
2017-06-29 11:15:35
-
2018-07-28 10:11:05
-
2018-10-19 08:48:29
-
2018-10-23 00:36:39
-
2015-11-03 16:39:36
-
02013-12-26 15:33:24
-
12017-03-08 18:36:15
-
2015-06-20 11:40:31
-
2014-02-25 16:57:03
-
2015-11-14 18:28:27
-
2016-03-09 20:52:30
-
2018-05-03 11:14:49
-
2017-07-13 16:46:16
-
2019-07-30 16:54:42
-
2015-06-01 15:36:28
-
2017-06-14 11:17:32
-
2015-06-05 08:39:04
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认