rtp
实时传输协议,可以使用udp和tcp
h264 和 h265h264有sps pps,se 帧,h265多一些,有sps pps vps等,不过不是很重要,接收的时候用的多一些,发送稍简单,以下是发送程序
mtu最大传输单元,不管是tcp还是udp都必须要分包发送,因为超过mtu实际上被交换机等设备分帧,所以必须小于交换机等设备的最大传输单元,这样效率比较高。一般我们可以定义mtu为1400字节,当然可以再小一点,加上rtp协议头部的12字节,最多为1412字节,各位可以自己拟定。
网络发送这一部分可以使用各类封装程序,也可以自己调用简单的socket api函数发送,具体不细节写了,读者可以自己用喜欢的程序来完成
void rtp_send_data(uint8_t *buf, int len, int last_packet_of_frame,uint32_t timestamp)
{
}
发送rtp for h264
分为h264和h265
void send_rtp_h264(uint8_t * data, int dlen,uint32_t timestamp)
{
int iSize = max_payload_size- RTP_HEADERS_SIZE;
uint8_t buf[max_payload_size];
uint8_t *pos = &buf[12];//0 -11 是rtp头部
if (dlen > iSize) { //超过MTU
const uint8_t s_e_r_Start = 0x80;
const uint8_t s_e_r_Mid = 0x00;
const uint8_t s_e_r_End = 0x40;
//获取帧头数据,1byte
unsigned char naluType = (*data) & 0x1f; //获取NALU的5bit 帧类型
unsigned char nal_ref_idc = (*data) & 0x60; //获取NALU的2bit 帧重要程度 00 可以丢 11不能丢
//nal_ref_idc = 0x60;
//组装FU-A帧头数据 2byte
unsigned char f_nri_type = nal_ref_idc + 28;//F为0 1bit,nri上面获取到2bit,28为FU-A分片类型5bit
unsigned char s_e_r_type = naluType;
bool bFirst = true;
bool mark = false;
int nOffset = 1;
while (!mark) {
if (dlen priv_data;
int rtp_payload_size = max_payload_size - RTP_HEVC_HEADERS_SIZE;
int nal_type = (buf[0] >> 1) & 0x3F;
/* send it as one single NAL unit? */
if (len index;
pkt->pts = av_rescale_q(pkt->pts, m_p_v->time_base,m_st_v->time_base);
pkt->dts = av_rescale_q(pkt->dts, m_p_v->time_base, m_st_v->time_base);
pkt->pos = -1;
av_interleaved_write_frame(m_fmtctx, pkt);
av_packet_free(&pkt);
}
void UnInit()
{
//销毁资源
if (!(m_fmtctx->oformat->flags & AVFMT_NOFILE))
avio_close(m_fmtctx->pb);
avformat_free_context(m_fmtctx);
}
};