海思hi3516C+imx122板子,VLC直播或录像mp4后回放,声音都是一顿一顿的。

来源:互联网 发布:node forever windows 编辑:程序博客网 时间:2024/05/01 20:42

从底层开始一点一点排查。

打开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

#

0 0