这段时间在做将ts码流实时解析成裸流,打包成rtmp发送出去,用vlc进行调试
我一般喜欢视频和音频分开调,互不影响,刚开始调试视频的时候,发现vlc没有反应,然后就用抓包,用wireshark分析,结果看到wireshark 解析的rtmp都是unknown,这很简单,就是打包的问题了,要不是msglen设置的不对,要不就是chunk size不对,这两者我都遇到了,rtmp在你发送过setchunksize之后,后续就必须按照你设置的chunksize进行打包,我程序里默认使用的chunksize是128,但是发送的setchunksize命令是4096,这就导致了wireshark解析为unknown,修改了setchunksize之后,就没有问题了。
每一个视频帧第一个rtmp包头类型是0,其他的都是3,这里需要注意rtmp 头的msglen,这个一定要计算正确,解析出来的h264裸流,每个nal单元都是00 00 01或者00 00 00 01分割的,而打包到rtmp中的nal则是size+naldata,要把00 00 01或者00 00 00 01去掉,换成nal的size即可,期间过滤掉sps pps 分隔符这三个nal单元
音频是我遇到最扯淡的,遇到的问题也比较多
1.解析出来的音频,一个pes包含了多个audio frame,也就是包含了多个adts,刚开始没注意,就直接将多个audio frame当成了一帧进行处理
2.必须是aac 采样率必须是44100,然后我就用ffmpeg转了一把(因为vlc提示采样率和设置的参数不一样)
3.结果还是播放失败,vlc全是爆音,提示的错误channel等一系列问题,然后我就用elecard看了一些,发现elecard解析出来的audioframe有嵌套的(adts嵌套)如下图
就以为是多音轨的,找了一天的原因,后面请教了一下音视频群里的大牛,结果人家的elecard解析出来的没有问题,我的elecard有问题,看来elecard也不能全信,暂时不管这个问题
4.打包问题,添加的负载数据不对,这是最简单的问题,却在最后发现,实在惭愧,打包数据正确后,声音播放正常