分类: C/C++
2017-08-04 16:36:36
以下是QQ物联音视频相关参数:
我方APP音视频参数
视频:H264
音频:PCM (8K采样,16bit,单通道)
中间件对外提供接口:
QQ物联连接:
接口封装参照QQ物联如下:
//初始化
inteq_initDevice();
//加载AV模块
inteq_start_av_service(eq_av_callback_t *cb);
//对接视频数据
inteq_set_video_data(unsigned char *pcEncData,int nEncDatalen,int nFrameType,intnTimeStamps,int nGopIndex,int nFrameIndex,int nTotalIndex,int nAvgQP);
//对接音频数据
int eq_set_audio_data(eq_audio_encode_param *param, unsigned char *pcEncData, int nEncDataLen, int nTimeStamps);
//缺绑定、报警上传,仍在doing。。。。。。。。。。
现象:APP播放出声音有一顿一顿的现象,不连贯。
排查过程:
1)没有丢包解码出来的PCM数据也是正常的,一开始以为Faad2解码性能太慢
2)单独测试Faad2解码接口发现一秒钟解码30多包数据,这个速度完全够了排除这个可能性
3)怀疑手机性能低,换手机,关掉视频流都不行,排除这个可能性
4)抓日志发现APP获取网络音频队列总是溢出,说明APP消耗音频数据慢与供给
5)发现APP固定一秒钟消耗5包音频数据,网络每秒供给7-8包数据,原因找到。
原因:QQ物联给的是8KHZ,单声道的AAC数据,我方APP需播放8KHZ,单声道PCM数据,咋一看没有问题,把AAC解码成PCM扔给APP的播放就可以了。但是QQ物联每次采样为128ms,APP端每200ms消耗一次,意味着QQ物联一秒钟给了8包数据,而APP每秒只能消耗5包。
解决方案1:
通过sem_init,sem_timewait,TIME_ADD,手动调试APP消耗间隔时间
解决方案2:
8KHZ,16bit,单声道,即每秒消耗:8000*2*1=16000个字节。200ms消耗3200个字节,即每秒消耗5包,每次消耗3200个字节。这样一算可以不用手动调试APP的消耗间隔时间,只要每次消耗时给足3200个字节即可。
我们再算一下QQ物联的,8KHZ,16bit,单声道,即每秒采集:8000*2*1=16000个字节。但是它一次采样128ms,则每次采样数据为:16000*(128/1000)=2048字节。故可以做个buf攒足了3200个字节在给APP的android接口播放。