|
最近在做RTMP网络推流,遇到了一些问题,现在把这些问题记录一下;
RTMP网络推流是基于RTMPDUMP来实现的,在刚调试的,把本地的音视频流做了简单的容器封装,推送到服务器;
在NGINX服务器中音频和视频都可以播放出来,音频出现卡顿,查了一下推流推包时间,发现推包时间不均匀,没有按照时间戳来进行推送,后来把RTMP的推流时间修改为数据包的时间戳后开始推送,在nginx上面的音频和视频的RTMP播放正常了;
虽然上面的问题基本已经解决,但在wowza上面的问题就比较多了,wowza 播放rtmp 出现音频卡顿,同时不能支持m3u8的视频转换播放;
这下就比较头疼了,只能把数据一个一个的扣代码了;
1. metadata数据
在flv中有metadata数据包,在rtmp 中可以不需要推送,推送上去也没有什么影响;
2. sps和pps
需要在第一次连接后推送到服务器上面;后面是不需要再推送;这个包类型为 AVC sequence header,按照AVCDecoderConfigurationRecord发送就可以,这个参考 标准ISO/IEC 14496-15 中的
5.2.4 小节就可以,注意:
unsigned int(8) AVCProfileIndication; //sps[1],即0x67 后面那个字节
unsigned int(8) profile_compatibility; //sps[2]
unsigned int(8) AVCLevelIndication; //sps[3]
unsigned int(2) lengthSizeMinusOne; //NALUnitLength 的长度减1,一般为3
lengthSizeMinusOne 加1 就是NALU 长度字段所占字节数。
unsigned int(5) numOfSequenceParameterSets; //sps 个数,一般为1
unsigned int(8) numOfPictureParameterSets; //pps 个数,一般为1
发送一个pps 和一个sps 就可以了;
3.视频数据的发送
视频数据正常发送就可以,在前面video tag中配置好后,数据的前面4字节为video数据的长度,后面为h264 nalu数据,这个里面没有00 00 00 01后的数据;
4.音频spicifiConfig包的发送
这个是在adts中没有配置的参数,像发送视频的sps一样,在连接后就发送一次就可以;
AAC sequence header也就是包含了AudioSpecificConfig,AudioSpecificConfig包含着一些更加详细音频的信息,AudioSpecificConfig的定义在ISO14496-3中1.6.2.1;在ffmpeg中有对AudioSpecificConfig解析的函数,ff_mpeg4audio_get_config(),可以对比的看一下,理解更深刻。
AAC raw 这种包含的就是音频ES流了,也就是audio payload.这里不需要添加负载长度,audio tag 中可以解析;
AudioSpecificConfig 简化格式如下:
audioObjectType 5bits 编码结构类型,AAC-LC 为2
samplingFrequencyIndex 4bits 音频采样率索引值
channelConfiguration 4bits 音频声道数
GASpecificConfig 该结构包含一下三项
frameLengthFlag 1bit 标志位,用于表明IMDCT 窗口长度,为0
dependsOnCoreCoder 1bit 标志位,表明是否依赖corecoder,为0
extensionFlag 1bit 扩展标志位,选择了AAC-LC,这里必须为0
AudioSpecificConfig的表有点绕,可以按照上面简化后的格式封装就可以;
(技术交流 ternence.hsu@foxmail.com)
经过上面的几个步骤的调整后,wowza 总算是可以播放出音视频数据了,m3u8转码也正常了。
接下来就是稳定性方面的测试了;
|
|