4719
- 收藏
- 点赞
- 分享
- 举报
海思音频解码[已解决-4楼答案]
本帖最后由 ngswfx 于 2017-11-24 12:38 编辑
对音频从来就比较恐惧,一致没敢碰,一直都是搞视频,现在有需求必须把音频搞出来,早在十年前,就折腾过一周左右时间的音频,那几个参数,由于低层理论搞不清楚,所以就不停修改,试了好多回,采样率,bitwidth,单双通道,编码方式,虽然最后搞定了,但在内心深处有了阴影,呵呵。
按照我的感觉,要出声不难,声音正确可不容易,目前就卡在这个声音不正确上了,也不知道是rtsp获取的声音数据异常,还是解码配置异常,还是VO参数配置异常。
目前3520D和3536都是这个声音,一模一样,配置为8Ksamplerate,就哒哒哒,改改配置,倒是不断断续续了,但音尖,感觉像是快放了一样
////////////////////可能层面1
先说音频来源部分:DH IPC 配置主次码流都是G711A 8K,这个IPC肯定是单声道,这个应该没啥疑问了,都是最基本的711。
////////////////rtsp得到音频数据:可能层面2,这里没检查rtp包的通道,只要发现是音频,都注入过来了,前端不可能发来2个通道音频吧?
INPUT Audio:0320 :41 44 42 4e 4a 75 75 77 74 4f 4d 49 75 49 41 45 45 45 5e 52 52 51 d4 db c5 dc d0 d2 dc d3 d7 d6 d0 d0 d6 d3 db c0
INPUT Audio:0320 :63 60 60 64 78 7f 7c 7d 7d 72 78 7a 65 64 65 7f 72 7d 73 76 77 76 77 75 74 77 71 73 72 70 70 74 49 47 5e 5e 5b 47
INPUT Audio:0320 :64 64 64 7b 79 7f 7f 7d 70 71 73 71 74 75 71 7d 7c 72 70 72 73 75 4f 40 47 5b 5e 5a 41 43 44 41 46 5a 5b 5e 52 5e
INPUT Audio:0320 :64 65 7b 7b 7a 79 7e 7f 79 78 78 78 7a 7b 7e 7d 72 72 7e 79 7e 7c 7f 7e 7d 76 71 76 71 70 70 7d 7e 7e 7f 7d 7c 7f
INPUT Audio:0320 :5e 5d 56 51 52 56 5c 44 46 45 45 44 45 45 5e 44 43 4b 74 75 4b 74 74 74 48 4b 4b 49 49 75 77 71 70 73 71 72 72 7d
INPUT Audio:0320 :f2 f3 f3 f2 ff fe f9 f9 f9 fe fc f3 f7 f7 f4 f7 f5 c8 cf c2 c1 c1 c1 c0 c2 c3 c4 c1 c2 ce c9 c9 c9 c8 c0 d9 de de
INPUT Audio:0320 :ef ef ec ec ed e3 e0 e0 e0 e0 e1 e7 e7 e7 e4 fa fa fa e5 e4 e5 e5 e5 e5 ff f3 f3 f6 f5 cd c3 cc f5 f5 ca cb cb cf
INPUT Audio:0320 :f5 ce f4 f0 f2 fc f9 e5 e7 e4 e5 e5 f8 f9 fe ff ff f9 fb e5 e1 e2 e0 e6 e6 e1 e1 e7 e5 f9 fe fc f3 f0 f0 fc fe f9
INPUT Audio:0320 :cd c8 c8 c9 cf cf cb f4 f7 f2 f8 e5 e4 e4 e7 e4 e4 e4 e5 e4 e4 e7 e6 e0 e3 e3 e0 e0 e3 e0 e0 e0 e1 e6 e6 e6 e6 e6
INPUT Audio:0320 :4f 48 4c 47 5a 59 5f 50 54 d6 d6 d5 d7 d0 c4 c6 c3 ca f4 f6 f7 f1 f3 f2 f9 fa e4 e7 e7 e4 fb ff f2 f0 f3 f3 f8 e7
INPUT Audio:0320 :7a 78 7e 7b 7a 65 7a 7b 7a 65 64 65 65 7a 7b 78 7f 7d 73 73 71 74 74 75 4b 75 4a 4a 4e 4c 43 46 5a 46 5a 5f 57 d5
INPUT Audio:0320 :7d 73 73 70 73 73 73 71 71 71 74 4b 4e 48 4b 4b 49 49 4d 43 47 5b 5f 52 5d 5d 59 47 4f 42 47 58 5e 56 d0 dc dd d1
INPUT Audio:0320 :75 77 76 71 70 76 72 7d 70 77 71 76 70 71 77 70 72 72 71 71 76 70 77 75 74 71 73 72 7c 7e 7b 7b 65 7a 65 65 65 64
INPUT Audio:0320 :74 48 48 42 4c 4a 77 71 73 7d 72 7d 7c 7d 73 72 7f 7d 71 71 76 76 75 77 71 70 70 77 77 71 73 72 70 70 7c 79 7b 7a
INPUT Audio:0320 :53 5f 51 d4 dd df db c3 ce ca ce c8 f5 f4 cb ce c8 ca f5 f4 f5 ca c8 cd c3 ce f7 f7 f4 f5 f5 f4 f5 ca f6 f6 f6 f6
INPUT Audio:0320 :f7 f6 f4 ca c9 f5 f5 ca c8 c9 f5 f7 cf ce f1 f1 f6 f0 f2 f3 f0 f3 f7 f5 ff fb e5 e4 e0 e1 e6 f8 fd f1 ca ce ce f5
////////可能层面3///输出为了方便,还没搞0输出通道,直接用的HDMI 的1通道,以下为源码,bSupportAudioOut全局变量,true,会开启hdmi音频输出硬件
//不知道这里面配置是否合适,3536的芯片,stAttr.enSampleRate好像必须弄成32000,HI_HDMI_SAMPLE_RATE_32K,否则开启不成功,3520D芯片这里用的是8K
HI_HDMI_ATTR_S stAttr;
HI_HDMI_VIDEO_FMT_E enVideoFmt;
HI_HDMI_EDID_S stEdidData;
/////////////////////////////////////////////////////
IVHI_VO_HdmiConvertSync(enIntfSync, &enVideoFmt);
HI_MPI_HDMI_Init();
HI_MPI_HDMI_Open(HI_HDMI_ID_0);
HI_MPI_HDMI_Force_GetEDID(HI_HDMI_ID_0,&stEdidData);
HI_MPI_HDMI_GetAttr(HI_HDMI_ID_0, &stAttr);
////////////////////////////////////////////////////
stAttr.bEnableHdmi = HI_TRUE;
stAttr.bEnableVideo = HI_TRUE;
stAttr.enVideoFmt = enVideoFmt;
stAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_YCBCR444;
stAttr.enDeepColorMode = HI_HDMI_DEEP_COLOR_OFF;
stAttr.bxvYCCMode = HI_FALSE;
stAttr.enDefaultMode = HI_HDMI_FORCE_HDMI;
stAttr.bEnableAudio = HI_FALSE;
stAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S;
stAttr.bIsMultiChannel = HI_FALSE;
stAttr.enBitDepth = HI_HDMI_BIT_DEPTH_16;
stAttr.bEnableAviInfoFrame = HI_TRUE;
stAttr.bEnableAudInfoFrame = HI_TRUE;
stAttr.bEnableSpdInfoFrame = HI_FALSE;
stAttr.bEnableMpegInfoFrame = HI_FALSE;
stAttr.bDebugFlag = HI_FALSE;
stAttr.bHDCPEnable = HI_FALSE;
stAttr.b3DEnable = HI_FALSE;
if(bSupportAudioOut){
printf("HDMI bSupportAudioOut:%d.\n",bSupportAudioOut);
stAttr.bEnableAudio = HI_TRUE; /**< 是否Enable音频 */
//HI_HDMI_SND_INTERFACE_SPDIF
stAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S;
//stAttr.enSampleRate = pstAioAttr->enSamplerate; /**< PCM音频采样率,此参数需要与AO的配置保持一致 */
stAttr.enSampleRate = (HI_HDMI_SAMPLE_RATE_E)AUDIO_SAMPLE_RATE_32000;
stAttr.u8DownSampleParm = HI_FALSE; /**< PCM音频向下downsample采样率的参数,默认为0 */
//stAttr.enBitDepth = 8 * (pstAioAttr->enBitwidth+1); /**< 音频位宽,默认为16,此参数需要与AO的配置保持一致 */
stAttr.enBitDepth =HI_HDMI_BIT_DEPTH_16;//(HI_HDMI_BIT_DEPTH_E)( 8*(AUDIO_BIT_WIDTH_16+1));
stAttr.u8I2SCtlVbit = 0; /**< 保留,请配置为0, I2S control (0x7A:0x1D) */
stAttr.bEnableAviInfoFrame = HI_TRUE; /**< 是否使能 AVI InfoFrame,建议使能 */
stAttr.bEnableAudInfoFrame = HI_TRUE; /**< 是否使能 AUDIO InfoFrame,建议使能 */
stAttr.bIsMultiChannel =HI_FALSE;// HI_TRUE;
}
HI_MPI_HDMI_SetAttr(HI_HDMI_ID_0, &stAttr);
HI_MPI_HDMI_Start(HI_HDMI_ID_0);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
可能层面4:
/////////////////////////////////////下面代码是初始化芯片时完成的,因为声音输出通道就1-2个,比较少,没有动态开启关闭了///////////////////////////////////////
//这里就开启了声音输出,开启AUDIO_BIT_WIDTH_8代码日志提示不成功,目前只能设置为AUDIO_BIT_WIDTH_16
//pstAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_16000,配置为AUDIO_SAMPLE_RATE_8000也不行,声音也不正常,如果不用HI_MPI_AO_EnableReSmp,感觉还稍微正常点,用了就容易哒哒哒,由于HDMI那里是32K,这里我的理解,就是主动把采样率转换为32K了,所以这么配置的
if(bSupportAudioOut){
//IVHI_Tlv320_CfgAudio(AIO_MODE_I2S_SLAVE, AUDIO_SAMPLE_RATE_8000);
int AoDevId=SAMPLE_AUDIO_HDMI_AO_DEV;//HDMI 音频输出为1
AIO_ATTR_S pstAioAttr;
memset(&pstAioAttr,0,sizeof (AIO_ATTR_S));
HI_MPI_AO_Disable(AoDevId);
/*s32Ret = HI_MPI_AO_GetPubAttr(AoDevId, &pstAioAttr);
printf("HI_MPI_AO_GetPubAttr s32Ret:%x!\n",s32Ret);
if(HI_SUCCESS == s32Ret){
printf("pstAioAttr.u32ChnCnt :%d\n",pstAioAttr.u32ChnCnt );
printf("pstAioAttr.enBitwidth :%d \n",pstAioAttr.enBitwidth );
}*/
//AOP1 在芯片内部实现和 HDMI 对接,对接方式只支持 I 2 S 主模式
pstAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_16000;//AUDIO_SAMPLE_RATE_32000;//AUDIO_SAMPLE_RATE_8000 AUDIO_SAMPLE_RATE_8000
pstAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
pstAioAttr.enWorkmode = AIO_MODE_I2S_MASTER;//AIO_MODE_I2S_MASTER;//AIO_MODE_I2S_SLAVE
pstAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; //AUDIO_SOUND_MODE_MONO AUDIO_SOUND_MODE_STEREO
pstAioAttr.u32EXFlag =0;//1;
pstAioAttr.u32FrmNum = 30;
pstAioAttr.u32PtNumPerFrm =SAMPLE_AUDIO_PTNUMPERFRM;// SAMPLE_AUDIO_PTNUMPERFRM; //320
pstAioAttr.u32ChnCnt =1;
pstAioAttr.u32ClkChnCnt = 2;
pstAioAttr.u32ClkSel = 0;
/////////////////////////////////
AUDIO_RESAMPLE_ATTR_S stAoReSampleAttr;
/* ao 8k -> 32k */
stAoReSampleAttr.u32InPointNum =320;// SAMPLE_AUDIO_PTNUMPERFRM;
stAoReSampleAttr.enInSampleRate = pstAioAttr.enSamplerate;
stAoReSampleAttr.enOutSampleRate = AUDIO_SAMPLE_RATE_32000;
AUDIO_RESAMPLE_ATTR_S *pstAoReSmpAttr=&stAoReSampleAttr;
///////////////////////////////////////////////////////////
s32Ret = IVHI_INNER_CODEC_CfgAudio(pstAioAttr.enSamplerate);
if (HI_SUCCESS != s32Ret)
{
printf("%s:SAMPLE_INNER_CODEC_CfgAudio failed\n", __FUNCTION__);
return s32Ret;
}
///////////////////////////////////////////////////////////////////////////////
s32Ret = HI_MPI_AO_SetPubAttr(AoDevId, &pstAioAttr);
printf("HI_MPI_AO_SetPubAttr s32Ret:%x!\n",s32Ret);
if(HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_SetPubAttr(%d) failed with %#x!\n", __FUNCTION__, AoDevId,s32Ret);
}
s32Ret = HI_MPI_AO_Enable(AoDevId);
printf("HI_MPI_AO_Enable s32Ret:%x!\n",s32Ret);
if(HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_Enable(%d) failed with %#x!\n", __FUNCTION__,AoDevId, s32Ret);
}
for (i=0; i
int AoChn=i;
s32Ret = HI_MPI_AO_EnableChn(AoDevId, AoChn);
printf("HI_MPI_AO_EnableChn:%d s32Ret:%x!\n",i,s32Ret);
if(HI_SUCCESS != s32Ret){
printf("%s: HI_MPI_AO_EnableChn(%d) failed with %#x!\n", __FUNCTION__, AoChn, s32Ret);
break;
}
if (NULL != pstAoReSmpAttr)
{
s32Ret = HI_MPI_AO_DisableReSmp(AoDevId, AoChn);
s32Ret |= HI_MPI_AO_EnableReSmp(AoDevId, AoChn,stAoReSampleAttr.enOutSampleRate);
if(HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_EnableReSmp(%d,%d) failed with %#x!\n", __FUNCTION__, AoDevId, AoChn, s32Ret);
break;
}
}
}
HI_S32 s32VolumeDb=3;//取值范围:[-81, 6],单位:dB
HI_MPI_AO_SetVolume(AoDevId,s32VolumeDb);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
可能层面5:解码部分,先打开音频解码器 nAudioType=PT_G711A,这个应该没啥疑问,里面的决定因素也不多,没啥参数可调整的
///////////////////////////////////////////////
gs_DecParam[AuChn].nAudioType=nAudioType;
HI_S32 s32Ret;
ADEC_CHN_ATTR_S stAdecAttr;
stAdecAttr.enType = (PAYLOAD_TYPE_E)nAudioType;
stAdecAttr.u32BufSize = 20;
stAdecAttr.enMode = ADEC_MODE_PACK;//ADEC_MODE_STREAM ADEC_MODE_PACK
if (PT_ADPCMA == stAdecAttr.enType)
{
ADEC_ATTR_ADPCM_S stAdpcm;
stAdecAttr.pValue = &stAdpcm;
stAdpcm.enADPCMType = ADPCM_TYPE_DVI4 ;
}
else if (PT_G711A == stAdecAttr.enType || PT_G711U == stAdecAttr.enType)
{
ADEC_ATTR_G711_S stAdecG711;
stAdecAttr.pValue = &stAdecG711;
}
else if (PT_G726 == stAdecAttr.enType)
{
ADEC_ATTR_G726_S stAdecG726;
stAdecAttr.pValue = &stAdecG726;
stAdecG726.enG726bps = MEDIA_G726_40K ;
}
else if (PT_LPCM == stAdecAttr.enType)
{
ADEC_ATTR_LPCM_S stAdecLpcm;
stAdecAttr.pValue = &stAdecLpcm;
stAdecAttr.enMode = ADEC_MODE_PACK;/* lpcm must use pack mode */
}
else
{
printf("%s: invalid aenc payload type:%d\n", __FUNCTION__, stAdecAttr.enType);
return HI_FAILURE;
}
/* create adec chn*/
s32Ret = HI_MPI_ADEC_CreateChn(AuChn, &stAdecAttr);
if (s32Ret)
{
printf("%s: HI_MPI_ADEC_CreateChn(%d) failed with %#x!\n", __FUNCTION__,AuChn,s32Ret);
return s32Ret;
}
//////////////////////////////////////////////////////
int AoDev=1;//HDMI 输出音频输出通道为1
int AoChn=AuChn;
int AdChn=AuChn;
MPP_CHN_S stSrcChn,stDestChn;
stSrcChn.enModId = HI_ID_ADEC;
stSrcChn.s32DevId = 0;
stSrcChn.s32ChnId = AdChn;
stDestChn.enModId = HI_ID_AO;
stDestChn.s32DevId = AoDev;
stDestChn.s32ChnId = AoChn;
s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
printf("%s: HI_MPI_ADEC_CreateChn(%d) with %#x!\n", __FUNCTION__,AuChn,s32Ret);
gs_DecParam[AuChn].bAudioInited=true;
//////////////////////////////////////////////////////////////////////
可能层面6:数据送入解码器,其中Audio_seq全局变量,每个包320都增加1
int AuChn=0;
char buffAudio[1024];
memset(buffAudio,0,sizeof buffAudio);
if(nLen>=1000)
return false;
buffAudio[0]=0x0;
buffAudio[1]=0x1;
buffAudio[2]=nLen/2;
buffAudio[3]=0x0;
memcpy(buffAudio+4,buffin,nLen);
int nAudioType=PT_G711A;//PT_G711A; //PT_G711A PT_ADPCMA PT_G711U
if(!gs_DecParam[AuChn].bAudioInited)
IVHI_HDEC_OpenAudioDecChl(AuChn,nAudioType);
if(!gs_DecParam[AuChn].bAudioInited){
printf("%s: IVHI_HDEC_OpenAudioDecChl(%d) bAudioInited=false\n", __FUNCTION__, AuChn);
return false;
}
AUDIO_STREAM_S stAudioStream;
stAudioStream.u64TimeStamp=u64pts;
Audio_seq++;
stAudioStream.u32Seq=Audio_seq;
stAudioStream.pStream =(unsigned char*)buffAudio;
HI_S32 s32Ret;
stAudioStream.u32Len = nLen+4;
s32Ret = HI_MPI_ADEC_SendStream(AuChn, &stAudioStream, HI_TRUE); //HI_TRUE 阻塞 HI_FALSE 非阻塞
if (s32Ret!=HI_SUCCESS)
{
printf("%s: HI_MPI_ADEC_SendStream(%d) failed with %#x!\n", __FUNCTION__, AuChn, s32Ret);
return false;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////问题现象,目前整体代码均无报错,没有提示哪个函数运行返回异常,目前就是声音出来后,音比较尖
我尝试调整过的代码部分是红色的部分,对于这种G711A 8K,不知道哪些参数对其有影响
对音频从来就比较恐惧,一致没敢碰,一直都是搞视频,现在有需求必须把音频搞出来,早在十年前,就折腾过一周左右时间的音频,那几个参数,由于低层理论搞不清楚,所以就不停修改,试了好多回,采样率,bitwidth,单双通道,编码方式,虽然最后搞定了,但在内心深处有了阴影,呵呵。
按照我的感觉,要出声不难,声音正确可不容易,目前就卡在这个声音不正确上了,也不知道是rtsp获取的声音数据异常,还是解码配置异常,还是VO参数配置异常。
目前3520D和3536都是这个声音,一模一样,配置为8Ksamplerate,就哒哒哒,改改配置,倒是不断断续续了,但音尖,感觉像是快放了一样
////////////////////可能层面1
先说音频来源部分:DH IPC 配置主次码流都是G711A 8K,这个IPC肯定是单声道,这个应该没啥疑问了,都是最基本的711。
////////////////rtsp得到音频数据:可能层面2,这里没检查rtp包的通道,只要发现是音频,都注入过来了,前端不可能发来2个通道音频吧?
INPUT Audio:0320 :41 44 42 4e 4a 75 75 77 74 4f 4d 49 75 49 41 45 45 45 5e 52 52 51 d4 db c5 dc d0 d2 dc d3 d7 d6 d0 d0 d6 d3 db c0
INPUT Audio:0320 :63 60 60 64 78 7f 7c 7d 7d 72 78 7a 65 64 65 7f 72 7d 73 76 77 76 77 75 74 77 71 73 72 70 70 74 49 47 5e 5e 5b 47
INPUT Audio:0320 :64 64 64 7b 79 7f 7f 7d 70 71 73 71 74 75 71 7d 7c 72 70 72 73 75 4f 40 47 5b 5e 5a 41 43 44 41 46 5a 5b 5e 52 5e
INPUT Audio:0320 :64 65 7b 7b 7a 79 7e 7f 79 78 78 78 7a 7b 7e 7d 72 72 7e 79 7e 7c 7f 7e 7d 76 71 76 71 70 70 7d 7e 7e 7f 7d 7c 7f
INPUT Audio:0320 :5e 5d 56 51 52 56 5c 44 46 45 45 44 45 45 5e 44 43 4b 74 75 4b 74 74 74 48 4b 4b 49 49 75 77 71 70 73 71 72 72 7d
INPUT Audio:0320 :f2 f3 f3 f2 ff fe f9 f9 f9 fe fc f3 f7 f7 f4 f7 f5 c8 cf c2 c1 c1 c1 c0 c2 c3 c4 c1 c2 ce c9 c9 c9 c8 c0 d9 de de
INPUT Audio:0320 :ef ef ec ec ed e3 e0 e0 e0 e0 e1 e7 e7 e7 e4 fa fa fa e5 e4 e5 e5 e5 e5 ff f3 f3 f6 f5 cd c3 cc f5 f5 ca cb cb cf
INPUT Audio:0320 :f5 ce f4 f0 f2 fc f9 e5 e7 e4 e5 e5 f8 f9 fe ff ff f9 fb e5 e1 e2 e0 e6 e6 e1 e1 e7 e5 f9 fe fc f3 f0 f0 fc fe f9
INPUT Audio:0320 :cd c8 c8 c9 cf cf cb f4 f7 f2 f8 e5 e4 e4 e7 e4 e4 e4 e5 e4 e4 e7 e6 e0 e3 e3 e0 e0 e3 e0 e0 e0 e1 e6 e6 e6 e6 e6
INPUT Audio:0320 :4f 48 4c 47 5a 59 5f 50 54 d6 d6 d5 d7 d0 c4 c6 c3 ca f4 f6 f7 f1 f3 f2 f9 fa e4 e7 e7 e4 fb ff f2 f0 f3 f3 f8 e7
INPUT Audio:0320 :7a 78 7e 7b 7a 65 7a 7b 7a 65 64 65 65 7a 7b 78 7f 7d 73 73 71 74 74 75 4b 75 4a 4a 4e 4c 43 46 5a 46 5a 5f 57 d5
INPUT Audio:0320 :7d 73 73 70 73 73 73 71 71 71 74 4b 4e 48 4b 4b 49 49 4d 43 47 5b 5f 52 5d 5d 59 47 4f 42 47 58 5e 56 d0 dc dd d1
INPUT Audio:0320 :75 77 76 71 70 76 72 7d 70 77 71 76 70 71 77 70 72 72 71 71 76 70 77 75 74 71 73 72 7c 7e 7b 7b 65 7a 65 65 65 64
INPUT Audio:0320 :74 48 48 42 4c 4a 77 71 73 7d 72 7d 7c 7d 73 72 7f 7d 71 71 76 76 75 77 71 70 70 77 77 71 73 72 70 70 7c 79 7b 7a
INPUT Audio:0320 :53 5f 51 d4 dd df db c3 ce ca ce c8 f5 f4 cb ce c8 ca f5 f4 f5 ca c8 cd c3 ce f7 f7 f4 f5 f5 f4 f5 ca f6 f6 f6 f6
INPUT Audio:0320 :f7 f6 f4 ca c9 f5 f5 ca c8 c9 f5 f7 cf ce f1 f1 f6 f0 f2 f3 f0 f3 f7 f5 ff fb e5 e4 e0 e1 e6 f8 fd f1 ca ce ce f5
////////可能层面3///输出为了方便,还没搞0输出通道,直接用的HDMI 的1通道,以下为源码,bSupportAudioOut全局变量,true,会开启hdmi音频输出硬件
//不知道这里面配置是否合适,3536的芯片,stAttr.enSampleRate好像必须弄成32000,HI_HDMI_SAMPLE_RATE_32K,否则开启不成功,3520D芯片这里用的是8K
HI_HDMI_ATTR_S stAttr;
HI_HDMI_VIDEO_FMT_E enVideoFmt;
HI_HDMI_EDID_S stEdidData;
/////////////////////////////////////////////////////
IVHI_VO_HdmiConvertSync(enIntfSync, &enVideoFmt);
HI_MPI_HDMI_Init();
HI_MPI_HDMI_Open(HI_HDMI_ID_0);
HI_MPI_HDMI_Force_GetEDID(HI_HDMI_ID_0,&stEdidData);
HI_MPI_HDMI_GetAttr(HI_HDMI_ID_0, &stAttr);
////////////////////////////////////////////////////
stAttr.bEnableHdmi = HI_TRUE;
stAttr.bEnableVideo = HI_TRUE;
stAttr.enVideoFmt = enVideoFmt;
stAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_YCBCR444;
stAttr.enDeepColorMode = HI_HDMI_DEEP_COLOR_OFF;
stAttr.bxvYCCMode = HI_FALSE;
stAttr.enDefaultMode = HI_HDMI_FORCE_HDMI;
stAttr.bEnableAudio = HI_FALSE;
stAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S;
stAttr.bIsMultiChannel = HI_FALSE;
stAttr.enBitDepth = HI_HDMI_BIT_DEPTH_16;
stAttr.bEnableAviInfoFrame = HI_TRUE;
stAttr.bEnableAudInfoFrame = HI_TRUE;
stAttr.bEnableSpdInfoFrame = HI_FALSE;
stAttr.bEnableMpegInfoFrame = HI_FALSE;
stAttr.bDebugFlag = HI_FALSE;
stAttr.bHDCPEnable = HI_FALSE;
stAttr.b3DEnable = HI_FALSE;
if(bSupportAudioOut){
printf("HDMI bSupportAudioOut:%d.\n",bSupportAudioOut);
stAttr.bEnableAudio = HI_TRUE; /**< 是否Enable音频 */
//HI_HDMI_SND_INTERFACE_SPDIF
stAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S;
//stAttr.enSampleRate = pstAioAttr->enSamplerate; /**< PCM音频采样率,此参数需要与AO的配置保持一致 */
stAttr.enSampleRate = (HI_HDMI_SAMPLE_RATE_E)AUDIO_SAMPLE_RATE_32000;
stAttr.u8DownSampleParm = HI_FALSE; /**< PCM音频向下downsample采样率的参数,默认为0 */
//stAttr.enBitDepth = 8 * (pstAioAttr->enBitwidth+1); /**< 音频位宽,默认为16,此参数需要与AO的配置保持一致 */
stAttr.enBitDepth =HI_HDMI_BIT_DEPTH_16;//(HI_HDMI_BIT_DEPTH_E)( 8*(AUDIO_BIT_WIDTH_16+1));
stAttr.u8I2SCtlVbit = 0; /**< 保留,请配置为0, I2S control (0x7A:0x1D) */
stAttr.bEnableAviInfoFrame = HI_TRUE; /**< 是否使能 AVI InfoFrame,建议使能 */
stAttr.bEnableAudInfoFrame = HI_TRUE; /**< 是否使能 AUDIO InfoFrame,建议使能 */
stAttr.bIsMultiChannel =HI_FALSE;// HI_TRUE;
}
HI_MPI_HDMI_SetAttr(HI_HDMI_ID_0, &stAttr);
HI_MPI_HDMI_Start(HI_HDMI_ID_0);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
可能层面4:
/////////////////////////////////////下面代码是初始化芯片时完成的,因为声音输出通道就1-2个,比较少,没有动态开启关闭了///////////////////////////////////////
//这里就开启了声音输出,开启AUDIO_BIT_WIDTH_8代码日志提示不成功,目前只能设置为AUDIO_BIT_WIDTH_16
//pstAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_16000,配置为AUDIO_SAMPLE_RATE_8000也不行,声音也不正常,如果不用HI_MPI_AO_EnableReSmp,感觉还稍微正常点,用了就容易哒哒哒,由于HDMI那里是32K,这里我的理解,就是主动把采样率转换为32K了,所以这么配置的
if(bSupportAudioOut){
//IVHI_Tlv320_CfgAudio(AIO_MODE_I2S_SLAVE, AUDIO_SAMPLE_RATE_8000);
int AoDevId=SAMPLE_AUDIO_HDMI_AO_DEV;//HDMI 音频输出为1
AIO_ATTR_S pstAioAttr;
memset(&pstAioAttr,0,sizeof (AIO_ATTR_S));
HI_MPI_AO_Disable(AoDevId);
/*s32Ret = HI_MPI_AO_GetPubAttr(AoDevId, &pstAioAttr);
printf("HI_MPI_AO_GetPubAttr s32Ret:%x!\n",s32Ret);
if(HI_SUCCESS == s32Ret){
printf("pstAioAttr.u32ChnCnt :%d\n",pstAioAttr.u32ChnCnt );
printf("pstAioAttr.enBitwidth :%d \n",pstAioAttr.enBitwidth );
}*/
//AOP1 在芯片内部实现和 HDMI 对接,对接方式只支持 I 2 S 主模式
pstAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_16000;//AUDIO_SAMPLE_RATE_32000;//AUDIO_SAMPLE_RATE_8000 AUDIO_SAMPLE_RATE_8000
pstAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
pstAioAttr.enWorkmode = AIO_MODE_I2S_MASTER;//AIO_MODE_I2S_MASTER;//AIO_MODE_I2S_SLAVE
pstAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; //AUDIO_SOUND_MODE_MONO AUDIO_SOUND_MODE_STEREO
pstAioAttr.u32EXFlag =0;//1;
pstAioAttr.u32FrmNum = 30;
pstAioAttr.u32PtNumPerFrm =SAMPLE_AUDIO_PTNUMPERFRM;// SAMPLE_AUDIO_PTNUMPERFRM; //320
pstAioAttr.u32ChnCnt =1;
pstAioAttr.u32ClkChnCnt = 2;
pstAioAttr.u32ClkSel = 0;
/////////////////////////////////
AUDIO_RESAMPLE_ATTR_S stAoReSampleAttr;
/* ao 8k -> 32k */
stAoReSampleAttr.u32InPointNum =320;// SAMPLE_AUDIO_PTNUMPERFRM;
stAoReSampleAttr.enInSampleRate = pstAioAttr.enSamplerate;
stAoReSampleAttr.enOutSampleRate = AUDIO_SAMPLE_RATE_32000;
AUDIO_RESAMPLE_ATTR_S *pstAoReSmpAttr=&stAoReSampleAttr;
///////////////////////////////////////////////////////////
s32Ret = IVHI_INNER_CODEC_CfgAudio(pstAioAttr.enSamplerate);
if (HI_SUCCESS != s32Ret)
{
printf("%s:SAMPLE_INNER_CODEC_CfgAudio failed\n", __FUNCTION__);
return s32Ret;
}
///////////////////////////////////////////////////////////////////////////////
s32Ret = HI_MPI_AO_SetPubAttr(AoDevId, &pstAioAttr);
printf("HI_MPI_AO_SetPubAttr s32Ret:%x!\n",s32Ret);
if(HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_SetPubAttr(%d) failed with %#x!\n", __FUNCTION__, AoDevId,s32Ret);
}
s32Ret = HI_MPI_AO_Enable(AoDevId);
printf("HI_MPI_AO_Enable s32Ret:%x!\n",s32Ret);
if(HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_Enable(%d) failed with %#x!\n", __FUNCTION__,AoDevId, s32Ret);
}
for (i=0; i
s32Ret = HI_MPI_AO_EnableChn(AoDevId, AoChn);
printf("HI_MPI_AO_EnableChn:%d s32Ret:%x!\n",i,s32Ret);
if(HI_SUCCESS != s32Ret){
printf("%s: HI_MPI_AO_EnableChn(%d) failed with %#x!\n", __FUNCTION__, AoChn, s32Ret);
break;
}
if (NULL != pstAoReSmpAttr)
{
s32Ret = HI_MPI_AO_DisableReSmp(AoDevId, AoChn);
s32Ret |= HI_MPI_AO_EnableReSmp(AoDevId, AoChn,stAoReSampleAttr.enOutSampleRate);
if(HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_EnableReSmp(%d,%d) failed with %#x!\n", __FUNCTION__, AoDevId, AoChn, s32Ret);
break;
}
}
}
HI_S32 s32VolumeDb=3;//取值范围:[-81, 6],单位:dB
HI_MPI_AO_SetVolume(AoDevId,s32VolumeDb);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
可能层面5:解码部分,先打开音频解码器 nAudioType=PT_G711A,这个应该没啥疑问,里面的决定因素也不多,没啥参数可调整的
///////////////////////////////////////////////
gs_DecParam[AuChn].nAudioType=nAudioType;
HI_S32 s32Ret;
ADEC_CHN_ATTR_S stAdecAttr;
stAdecAttr.enType = (PAYLOAD_TYPE_E)nAudioType;
stAdecAttr.u32BufSize = 20;
stAdecAttr.enMode = ADEC_MODE_PACK;//ADEC_MODE_STREAM ADEC_MODE_PACK
if (PT_ADPCMA == stAdecAttr.enType)
{
ADEC_ATTR_ADPCM_S stAdpcm;
stAdecAttr.pValue = &stAdpcm;
stAdpcm.enADPCMType = ADPCM_TYPE_DVI4 ;
}
else if (PT_G711A == stAdecAttr.enType || PT_G711U == stAdecAttr.enType)
{
ADEC_ATTR_G711_S stAdecG711;
stAdecAttr.pValue = &stAdecG711;
}
else if (PT_G726 == stAdecAttr.enType)
{
ADEC_ATTR_G726_S stAdecG726;
stAdecAttr.pValue = &stAdecG726;
stAdecG726.enG726bps = MEDIA_G726_40K ;
}
else if (PT_LPCM == stAdecAttr.enType)
{
ADEC_ATTR_LPCM_S stAdecLpcm;
stAdecAttr.pValue = &stAdecLpcm;
stAdecAttr.enMode = ADEC_MODE_PACK;/* lpcm must use pack mode */
}
else
{
printf("%s: invalid aenc payload type:%d\n", __FUNCTION__, stAdecAttr.enType);
return HI_FAILURE;
}
/* create adec chn*/
s32Ret = HI_MPI_ADEC_CreateChn(AuChn, &stAdecAttr);
if (s32Ret)
{
printf("%s: HI_MPI_ADEC_CreateChn(%d) failed with %#x!\n", __FUNCTION__,AuChn,s32Ret);
return s32Ret;
}
//////////////////////////////////////////////////////
int AoDev=1;//HDMI 输出音频输出通道为1
int AoChn=AuChn;
int AdChn=AuChn;
MPP_CHN_S stSrcChn,stDestChn;
stSrcChn.enModId = HI_ID_ADEC;
stSrcChn.s32DevId = 0;
stSrcChn.s32ChnId = AdChn;
stDestChn.enModId = HI_ID_AO;
stDestChn.s32DevId = AoDev;
stDestChn.s32ChnId = AoChn;
s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
printf("%s: HI_MPI_ADEC_CreateChn(%d) with %#x!\n", __FUNCTION__,AuChn,s32Ret);
gs_DecParam[AuChn].bAudioInited=true;
//////////////////////////////////////////////////////////////////////
可能层面6:数据送入解码器,其中Audio_seq全局变量,每个包320都增加1
int AuChn=0;
char buffAudio[1024];
memset(buffAudio,0,sizeof buffAudio);
if(nLen>=1000)
return false;
buffAudio[0]=0x0;
buffAudio[1]=0x1;
buffAudio[2]=nLen/2;
buffAudio[3]=0x0;
memcpy(buffAudio+4,buffin,nLen);
int nAudioType=PT_G711A;//PT_G711A; //PT_G711A PT_ADPCMA PT_G711U
if(!gs_DecParam[AuChn].bAudioInited)
IVHI_HDEC_OpenAudioDecChl(AuChn,nAudioType);
if(!gs_DecParam[AuChn].bAudioInited){
printf("%s: IVHI_HDEC_OpenAudioDecChl(%d) bAudioInited=false\n", __FUNCTION__, AuChn);
return false;
}
AUDIO_STREAM_S stAudioStream;
stAudioStream.u64TimeStamp=u64pts;
Audio_seq++;
stAudioStream.u32Seq=Audio_seq;
stAudioStream.pStream =(unsigned char*)buffAudio;
HI_S32 s32Ret;
stAudioStream.u32Len = nLen+4;
s32Ret = HI_MPI_ADEC_SendStream(AuChn, &stAudioStream, HI_TRUE); //HI_TRUE 阻塞 HI_FALSE 非阻塞
if (s32Ret!=HI_SUCCESS)
{
printf("%s: HI_MPI_ADEC_SendStream(%d) failed with %#x!\n", __FUNCTION__, AuChn, s32Ret);
return false;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////问题现象,目前整体代码均无报错,没有提示哪个函数运行返回异常,目前就是声音出来后,音比较尖
我尝试调整过的代码部分是红色的部分,对于这种G711A 8K,不知道哪些参数对其有影响
我来回答
回答12个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
122015-06-04 15:03:31
-
2015-11-12 13:54:15
-
2015-11-05 16:04:45
-
2013-10-29 13:07:47
-
2016-03-28 13:04:49
-
2020-03-05 17:39:59
-
2016-07-04 08:47:34
-
2016-03-29 15:42:52
-
2016-09-20 10:29:22
-
2016-04-05 11:29:44
-
2017-03-14 09:48:51
-
2018-08-08 15:21:48
-
2015-09-14 22:52:09
-
2016-09-14 12:22:26
-
2015-09-08 14:06:59
-
2017-08-28 22:06:44
-
2017-07-12 19:49:42
-
2016-08-10 15:34:37
-
2018-12-21 01:06:21
无更多相似问答 去提问
点击登录
-- 积分
-- 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币)
取消
确认