从底层开始一点一点排查。
打开audiocap.h中的调试开关://#define AUDIO_DEBUG_PCM1
1、从hisi sdk底层存为.pcm来听,感觉还是连续的,sample rate无论设置为8000还是44100,听起来都还是连续的。
这里发现mic的analog gain和digital gain设置为:
AGain=30,DGain=20比较合适。
#define AUDIO_DEBUG_AAC 1
2、单独存为.aac文件,发现听起来就有问题,速度不对,也就是sample rate不对,加速了。为了排除video的干扰,单独写了一个只有audio的驱动。设计了下面这个调试开关:
#define AUDIO_ONLY_DEBUG 1
# cat /tmp/live.log
TS:00:06:45 :gAencIn[0].enable=1,gAencIn[0].codec=81
TS:00:06:45 :Audiocodec=0x81,samplerate=44100,bits=16,ch=1,BytesPerFrm=1024,FrmNum=25,kbps=16,interval=11 ms
TS:00:06:45:Audio_Init(bMic=1,samplerate=44100,PtNumPerFrm=1764,AGain=30,DGain=20),ret=0
TS:00:06:45 :liveInit(),ret=0
TS:00:06:57 :liveUninit(),ret=0
TS:00:21:03 :gAencIn[0].enable=1,gAencIn[0].codec=81
TS:00:21:03 :Audiocodec=0x81,samplerate=44100,bits=16,ch=1,BytesPerFrm=1024,FrmNum=25,kbps=16,interval=11 ms
TS:00:21:03:Audio_Init(bMic=1,samplerate=44100,PtNumPerFrm=1764,AGain=30,DGain=20),ret=0
TS:00:21:03 :liveInit(),ret=0
TS:00:21:03 :rtmp_url=rtmp://127.0.0.1:1935/live/0
TS:00:21:03 :liveCreate(0),ret=0,live session num=1
#
# cat /tmp/
/tmp/live.log /tmp/rec.log /tmp/tcpsvr.log /tmp/vos.log
/tmp/mount.txt /tmp/rtxp.log /tmp/vod.log
# cat /tmp/rtxp.log
TS:00:06:45 :rtspsvrInit(554), ret=0
TS:00:06:57 :rtspsvrUninit()
TS:00:06:57 :openrtxpUninit()
TS:00:21:03 :rtspsvrInit(554), ret=0
TS:00:21:03 :srs-librtmp version: 3.0.3
TS:00:21:03 :rtmp simple handshake success!
TS:00:21:03 :rtmp connect vhost/app success
TS:00:21:03 :RTMP_Init(),ret=0
#
测试时发现,aac压缩出来的文件播放时,声音被加速了,速度不对!
经确认,用AOT_AAC_LC来设置fdkaac就会导致这个问题,换成AOT_SBR就不会了。
int aot =AOT_SBR; //AOT_AAC_LC;
if(aacEncoder_SetParam(handle, AACENC_AOT, aot) != AACENC_OK) {
fprintf(stderr,"Unable to set the AOT\n");
ret=-3;gotoEnd;
}
同时发现,即使换成AOT_SBR格式算法,如果用44100作为sample rate,也一样会出现加速的现象。只能改为16000采样率。NOTE: Srs目前default是只支持44100的。没想到,VLC也不支持32000以下的采样率。只好换成32000作为sample rate。因为,44100采样率在播放时会加速。看来,业界最好的fdkaac encoder也有许多问题嘛。
用samplerate=32000+AOT_AAC_LC后,声音不连贯的情况有很大改善,不过还是有卡顿的现象。但我单独录下来的.aac文件用VLC来播放是连续的。
这说明audio没有丢帧,只是直播时,某些延时不当或是A/V pts不同步导致的。
从VLC统计来看,audio并没有丢帧,但video却有28个丢帧。
TS:00:09:09 :VI_PipelineInit(),ret=0.
TS:00:09:10 :gAencIn[0].enable=1,gAencIn[0].codec=81
TS:00:09:10 :Audiocodec=0x81,samplerate=32000,bits=16,ch=1,BytesPerFrm=1024,FrmNum=25,kbps=32,interval=32 ms
TS:00:09:10:Audio_Init(bMic=1,samplerate=32000,PtNumPerFrm=1280,AGain=30,DGain=20),ret=0
TS:00:09:10 :liveInit(),ret=0
TS:00:09:10 :Init gAudioPtsNow=141,gVideoPtsNow=101
TS:00:09:10 :!!!audio sync wait... //audio的pts超过video,这说明video有丢包!
TS:00:09:10 :!!!audio sync wait...
TS:00:09:10 :!!!audio sync wait...
TS:00:09:18 :VI_ForceKeyFrame(1),ret=0
TS:00:09:18 :liveCreate(1),ret=0,live session num=1
TS:00:12:08 :Video Path[0],Capture continued 178s,4500frames,180 i-frames.FPS=25
TS:00:14:27 :liveDestroy(1),ret=0,live session num=0
#