您当前的位置: 首页 > 

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

webrtc 和 rtp 协议

qianbo_insist 发布时间:2021-02-20 21:13:06 ,浏览量:0

我会开辟一个空间rtp协议,包含vp9 h264 h265 aac opus 等rtp实例,包含实例代码,让看文章的人得到真实的提升

一、webrtc

rtp协议为实时传输协议 real transfer protocol webrtc 已经被w3c(万维网联盟) 和IETF(互联网工程任务组)宣布成为正式标准,webrtc 底层使用 rtp 协议来传输音视频内容,同时可以使用websocket协议和http等标准协议来传输信令。rtp其实可以作为传输层来看,也可以看成半传输层半应用层协议。

二、rtp协议

rtp协议太重要了,如果你懂rtp协议,那基本就会把音视频传输里所有的协议摸一遍,为什么,我们来说一下:

1 sip 协议传输层使用rtp 2 rtsp 协议传输层使用rtp 3 onvif协议使用rtsp协议,最终到了rtp协议上 4 webrtc 使用srtp协议,最终又到了rtp协议上 5 国标GB28181使用sip 传输信令,最终又到了rtp协议上 6 dlna协议和miracast协议直播使用rtsp ,传输当然还是rtp

没骗你吧,所以作为一名开发者,如果懂了rtp 协议,能够徒手写出rtp协议,基本就成了你的功力了。其他协议如rtmp,xmpp,等等就都不在话下了。

rtp协议头部一般来说为12字节,

 typedef struct 
{
    /**//* byte 0 */
    unsigned char csrc_len:4;        /**//* expect 0 */
    unsigned char extension:1;        /**//* expect 1, see RTP_OP below */
    unsigned char padding:1;        /**//* expect 0 */
    unsigned char version:2;        /**//* expect 2 */
    /**//* byte 1 */
    unsigned char payload:7;        /**//* RTP_PAYLOAD_RTSP */
    unsigned char marker:1;        /**//* expect 1 */
    /**//* bytes 2, 3 */
    unsigned short seq_no;            
    /**//* bytes 4-7 */
    unsigned  long timestamp;        
    /**//* bytes 8-11 */
    unsigned long ssrc;            /**//* stream number is used here. */
} RTP_FIXED_HEADER;

rtp的头部并非固定12字节,是可以扩展的,具体就看头部的extension是否为1,先来一个rtp h264 的发送实例,发送rtp h264 并且播放。播放在下一篇。

三、show me the code
#include 
#include 
#include 
#include "RTPDefine.h"

//小端转大端
uint32_t little2big(uint32_t le) {

	return (le & 0xff)  24) & 0xff;
}

//大端转小端
uint32_t big2little(uint32_t be)
{
	return ((be >> 24) & 0xff)
		| ((be >> 8) & 0xFF00)
		| ((be payload = pt;
	h->marker = mark;
	h->seq_no = little2big(seq);
	h->timestamp = little2big(ts);
	h->ssrc = little2big(ssrc);
	
	return 0;
}

static int rtp_packet_for_h264( char *output, int out_len, char *intput, int int_len, 
	rtp_send_callback call_back, void *arg)
{
	unsigned char fu[2];

	//DBG_INFO("size %d\n",size);
	
	int len = start_code_check(intput, int_len);//start code
	
	if (int_len  FU-A */
        fu[0] |= nri;
        fu[1] = type;
        fu[1] |= 1             
关注
打赏
1663161521
查看更多评论
0.0393s