也谈GB28181码流收发

1.前置文章

PS封装格式:GB28181协议RTP传输

H265的国标PS流打包

这两篇文章里面有的就不细说了

2.发送的规则细节

  • 在国标中,不需要对H264/H265裸流进行进一步的去NAL等操作,直接发裸流即可。如果一个包发不下,可以分包发送,但是每个分包都需要有RTP头。
  • 虽然理论上是要去读取PSM的,但是一般来说,0xE0就是视频,0xC0就是音频。
  • H264是0x1B,H265是0x24,这个H265的那篇文章也提到了。
  • 部分神奇的设备会不是每帧开头都有PSH头,需要保护,如果RTP Seq连续就不需要特殊处理了。

3. 关于音频的收发

  • 一般来说,音频包不会混在未完成发送的一帧视频帧中发送。
  • RTP头层面使用,和视频一起的SSRC和递增Seq进行发送。和普通RTP不同,国标里音频的时间戳单位和视频一致,也采用了90000/秒,而非采样率相关。
  • 音频(甚至多个音频)可以与视频采用相同的RTP Timestamp,但是不建议小于已发送的上一个TS。
  • 不要相信PES里面的时间戳(也是90khz),部分平台会瞎打,还是建议根据音频格式和数据大小推测实际的时间戳。
  • 所有的音频数据结尾时,也需要Marker位作为结束标识(普通RTP中Marker=true表示静音,音频包不应当打Marker)。甚至部分设备会将PS头单独一个UDP包发送,和视频一样需要做拼接处理。
  • 常见的音频格式包括:
enum PS_ES_StreamType
	{
		ES_STREAMTYPE_AUDIO_AAC = 0x0f,
		ES_STREAMTYPE_VIDEO_MPEG4 = 0x10,
		ES_STREAMTYPE_VIDEO_H264 = 0x1b,
		ES_STREAMTYPE_VIDEO_H265 = 0x24,
		ES_STREAMTYPE_VIDEO_SVAC = 0x80,
		ES_STREAMTYPE_AUDIO_AC3 = 0x81,
		ES_STREAMTYPE_AUDIO_DTS = 0x8a,
		ES_STREAMTYPE_AUDIO_LPCM = 0x8b,
		ES_STREAMTYPE_AUDIO_G711A = 0x90,
		ES_STREAMTYPE_AUDIO_G711U = 0x91,
		ES_STREAMTYPE_AUDIO_G722_1 = 0x92,
		ES_STREAMTYPE_AUDIO_G723_1 = 0x93,
		ES_STREAMTYPE_AUDIO_G729 = 0x99,
		ES_STREAMTYPE_AUDIO_SVAC = 0x9b
	};
  • 当音视频一起发送时,可以像P帧一样处理音频发送,只包含PSH头和PES头,后面就是音频裸数据了。如果是语音对讲时,因为不需要发送视频,最好定期发送携带SYS头、PSM头的完整数据包,方便接收端确认你的音频能力。此时SYS头中,可以标注不含视频。
sys->start_code[0] = 0;
sys->start_code[1] = 0;
sys->start_code[2] = 1;
sys->start_code[3] = 0xBB;
sys->header_length[0] = 0;
sys->header_length[1] = 9;//if we have both video&audio ,it's 12
sys->rate_bound[0] = 0x80;
sys->rate_bound[1] = 0x00;
sys->rate_bound[2] = 0x01;
sys->audio_bound = 1;
sys->system_audio_lock_flag = 1;
sys->system_video_lock_flag = 0;//video not support
sys->marker_bit = 1;
sys->video_bound = 0;
sys->reserved_byte = 0xFF;

psm->start_code[0] = 0;
psm->start_code[1] = 0;
psm->start_code[2] = 1;
psm->start_code[3] = 0xBC;
psm->header_length[1] = 14;// == 6 + es_map_length + 4crc ,crc current is not important,just leave blank(if we have both video&audio,it's 18)		
psm->reserved1 = 3;
psm->current_next_indicator = 1;
psm->marker_bit = 1;
psm->reserved2 = 127;
psm->es_map_length[1] = 4;//only audio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值