【Hisi音频】Hi3520D音频输出调试
一、原理
Hi3520D音頻(AUDIO)模塊包括音頻輸入、音頻輸出、音頻編碼、音頻編碼和音頻解碼模塊。音頻輸入和輸出模塊通過對Hi3520D芯片SIO設(shè)備的控制實(shí)現(xiàn)相應(yīng)的音頻輸入輸出功能;編碼和解碼模塊則提供對ADPCM、G726、G711、PCM格式的音頻編解碼功能。
讀取本地音頻進(jìn)行輸出播放,主要原理如下:芯片利用DMA將內(nèi)存中的數(shù)據(jù)傳輸?shù)紸O設(shè)備。AO設(shè)備通過I2S時(shí)序或PCM時(shí)序向AudioCodec發(fā)送數(shù)據(jù)。AudioCodec完成數(shù)字信號到模擬信號的轉(zhuǎn)換過程,并輸出模擬信號。
Hi3520D音頻解碼播放流程:
1、? 音頻輸出屬性初始化(通過結(jié)構(gòu)體AIO_ATTR_S來進(jìn)行設(shè)置);
2、? 配置音頻編解碼模塊(ACODEC);
3、? 根據(jù)音頻編碼協(xié)議創(chuàng)建音頻解碼通道;
4、? 設(shè)置AO設(shè)備屬性;啟用AO設(shè)備;啟用AO通道(啟用AO重采樣,此項(xiàng)可選);
5、? 綁定音頻輸出通道到音頻解碼通道;
6、? 向每包待發(fā)送的音頻數(shù)據(jù)頭添加4字節(jié)的海思音頻協(xié)議頭;
7、? 向音頻解碼通道發(fā)送組合后的音頻數(shù)據(jù)包;
8、? 播放聲音。
二、調(diào)試過程
1、 制作原始音頻數(shù)據(jù)(raw data)文件
Hi35XX系列芯片編解碼所支持的音頻格式主要是ADPCM、G726、G711、PCM等原始音頻格式,常見的音頻格式無法直接播放。因此若要輸出播放本地音頻,需先將音頻轉(zhuǎn)化成原始音頻格式。
圖1Adobe Audition啟動界面
這里使用的是AdobeAudition音頻處理軟件(支持將音頻轉(zhuǎn)化成pcm raw data格式)。安裝破解后,打開軟件(不要在破解前打開),界面如圖1所示。
在載入音頻文件之前,打開Edit->Preferences->Media & Disk Cache,勾選DLMS使能,如圖2所示。否則軟件無法正常載入音頻文件。
圖2打開DLMS使能
通過File->Open或者File->Import->File載入音頻文件。載入音頻后,會出現(xiàn)如圖3所示的界面。如果不出現(xiàn)右側(cè)的波形圖,則說明音頻文件沒有正確載入。載入后,可以播放試聽。
圖3載入音頻文件
通過File->Saveas或File->Export->File導(dǎo)出特定格式的音頻文件。導(dǎo)出前設(shè)置好導(dǎo)出格式即可,具體如下:Format選擇libsndfile;在 Sample Type中設(shè)置SampleRate、Channels、BiteDepth等(按圖示進(jìn)行設(shè)置即可);在FormatSetting中,Format選擇RawData,Encoding中選擇16bit-PCM,ByteOrder選擇默認(rèn)即可。
設(shè)置完OK即可導(dǎo)出pcm格式的原始音頻文件。
圖4 輸出格式設(shè)置
?
2、 系統(tǒng)和AUDIO模塊的初始化
調(diào)用sample_comm_sys.c文件中的HI_S32SAMPLE_COMM_SYS_Init(VB_CONF_S*pstVbConf)接口即可。
?
3、 音頻輸出屬性初始化
音頻輸出屬性通過結(jié)構(gòu)體AIO_ATTR_S進(jìn)行配置,配置時(shí)調(diào)用HI_S32SAMPLE_COMM_AUDIO_CfgAcodec(AIO_ATTR_S*pstAioAttr)接口即可,由于我們用到的解碼芯片是nvp6124,所以我們只需在該接口定義所在的文件sample_comm_audio.c增加宏定義#define HI_ACODEC_TYPE_NVP6124即可,也即實(shí)際調(diào)用的是HI_S32 SAMPLE_NVP6124_CfgAudio(constAIO_ATTR_S *pstAioAttr)接口,而這個(gè)接口實(shí)際是通過nvp6124驅(qū)動中的nvp6124_audio_format結(jié)構(gòu)體和ioctl()接口來實(shí)現(xiàn)的。
?
4、 創(chuàng)建音頻解碼通道
音頻解碼通道的創(chuàng)建通過調(diào)用系統(tǒng)函數(shù)HI_S32HI_MPI_ADEC_CreateChn(AdChn,&stAdecAttr)實(shí)現(xiàn),具體可參考HI_S32SAMPLE_COMM_AUDIO_StartAdec (ADEC_CHN AdChn, PAYLOAD_TYPE_E enType)的實(shí)現(xiàn)。指定好解碼通道和解碼文件的類型即可,這里分別為0和PT_LPCM。
?
5、 啟動AO設(shè)備和AO通道
具體可參照HI_S32 SAMPLE_COMM_AUDIO_StartAo(AUDIO_DEVAoDevId, HI_S32 s32AoChnCnt, AIO_ATTR_S* pstAioAttr, AUDIO_SAMPLE_RATE_EenInSampleRate, HI_BOOL bResampleEn)。
HI_S32 HI_MPI_AO_SetPubAttr (AUDIO_DEVAoDevId, const AIO_ATTR_S *pstAttr)設(shè)置AO設(shè)備屬性。注意pstAttr音頻中設(shè)置的參數(shù)AO設(shè)備可支持且和音頻文件的參數(shù)保持一致。
HI_S32 HI_MPI_AO_Enable(AUDIO_DEV AoDevId)設(shè)置AO設(shè)備使能。
HI_S32 HI_MPI_AO_EnableChn(AUDIO_DEV AoDevId,AO_CHN AoChn)設(shè)置解碼通道使能。
這里不需要再像例程里那樣進(jìn)行重采樣。
??????
6、 綁定輸出通道和音頻解碼通道
直接調(diào)用系統(tǒng)函數(shù)HI_S32? HI_MPI_SYS_Bind(MPP_CHN_S*pstSrcChn, MPP_CHN_S *pstDestChn)進(jìn)行綁定即可。
具體可參考HI_S32SAMPLE_COMM_AUDIO_AoBindAdec(AUDIO_DEVAoDev, AO_CHN AoChn, ADEC_CHN AdChn)接口的實(shí)現(xiàn)。
?
7、 向音頻文件添加海思音頻協(xié)議頭并向音頻解碼通道發(fā)送音頻數(shù)據(jù)包
首先需要打開本地音頻文件,直接調(diào)用fopen()函數(shù)即可,具體可參考或使用staticFILE *SAMPLE_AUDIO_OpenAdecFile(ADEC_CHNAdChn, PAYLOAD_TYPE_E enType)函數(shù)即可。
原始音頻文件放在和應(yīng)用同級目錄下,這里默認(rèn)命名為audio_chn0.pcm(與OpenAdecFile() 函數(shù)中設(shè)定的文件名稱和類型相同即可)。
?
創(chuàng)建線程向解碼器傳輸音頻文件流解碼,具體可參考和使用HI_S32SAMPLE_COMM_AUDIO_CreatTrdFileAdec(ADEC_CHNAdChn, FILE *pAdcFd) 主要是通過調(diào)用系統(tǒng)接口HI_S32HI_MPI_ADEC_SendStream(ADEC_CHN AdChn,const AUDIO_STREAM_S *pstStream, HI_BOOL bBlock)來實(shí)現(xiàn)的,在發(fā)送音頻流數(shù)據(jù)前會添加4個(gè)字節(jié)的海思音頻協(xié)議頭{0,1,160,0}。
?
至此,即可實(shí)現(xiàn)對本地文件的播放。注意:需要避免整個(gè)程序退出,才能實(shí)現(xiàn)持續(xù)的播放,可通過getchar()等函數(shù)來實(shí)現(xiàn)(類似于opencv中圖片的顯示需要借助于waitKey());
?
8、 其他
設(shè)置音量和靜音:在實(shí)現(xiàn)以上環(huán)節(jié)以后,可通過HI_S32HI_MPI_AO_SetVolume (AUDIO_DEVAoDevId, HI_S32 s32VolumeDb)和HI_S32HI_MPI_AO_SetMute (AUDIO_DEV AoDevId,HI_BOOL bEnable, AUDIO_FADE_S *pstFade)進(jìn)行音量和靜音設(shè)置
播放退出:退出播放時(shí),需要將上面創(chuàng)建的通道、打開的設(shè)備、創(chuàng)建的關(guān)聯(lián)等關(guān)閉釋放和解除,具體可參考例程。
?
?
三、參考
1、主要參考文檔:《HiMPPV3.0 媒體處理軟件開發(fā)參考》,含有原理、API、錯(cuò)誤碼等。
2、參考sample_audio.c中的HI_S32SAMPLE_AUDIO_AdecAo(HI_VOID)接口函數(shù)。
3、 hi3520d音頻輸出調(diào)試成功(http://bbs.ebaina.com/forum.php?mod=viewthread&tid=9155)。
4、HI3520D音頻(http://blog.csdn.net/dagefeijiqumeiguo/article/details/51763903)
總結(jié)
以上是生活随笔為你收集整理的【Hisi音频】Hi3520D音频输出调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法+图像处理】2D卷积与快速卷积算法
- 下一篇: 【Machine Learning】K-