海思HI3520D解码RTP音频
1 E币
成为会员,免费下载资料
文件大小:4.03 MB
上传者:艾编程的鲁小班
时间:2018-12-01 13:04:59
下载量:12
本帖最后由 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及时去清空缓存。
[attach]9302[/attach]
[attach]9301[/attach]
[attach]9299[/attach]
一,解决问题的思路
在遇到音频流的时候,不管是什么格式的音频数据(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演示播放流程,获取交互的包)
[attach]10157[/attach]
[attach]10158[/attach]
[attach]10158[/attach]
如上有用的字段:
通过VLC查看的编码信息与SDP获得的信息可能不一致,实际按SDP的信息来初始化AAC或者封装AAC成音频文件。
[attach]10159[/attach]
如上关键数据是配置将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及时去清空缓存。
[attach]9302[/attach]
[attach]9301[/attach]
[attach]9299[/attach]
展开》
折叠》