我会开辟一个空间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 <stdio.h>
#include <stdint.h>
#include <memory.h>
#include "RTPDefine.h"//小端转大端
uint32_t little2big(uint32_t le) {return (le & 0xff) << 24| (le & 0xff00) << 8| (le & 0xff0000) >> 8| (le >> 24) & 0xff;
}//大端转小端
uint32_t big2little(uint32_t be)
{return ((be >> 24) & 0xff)| ((be >> 8) & 0xFF00)| ((be << 8) & 0xFF0000)| ((be << 24));
}
//小端转大端
uint16_t little2bigs(uint16_t num)
{uint16_t swapped = (num >> 8) | (num << 8);return swapped;
}//大端转小端
uint16_t big2littles(uint16_t be)
{short swapped = (be << 8) | (be >> 8);return swapped;
}
static int start_code_check(char *buf, int len)
{#define D(x) *(buf+x)if (len < 4)return 0;uint8_t c1 = *buf;if ((D(0) | D(1)) == 0){switch (D(2)){case 0:return D(3) == 1 ? 4 : -1;case 1:return 3;}}return 0;
}int rtp_packet_init_header(char *rtp_hd, uint8_t pt, uint8_t mark, uint16_t seq, uint32_t ts, uint32_t ssrc)
{if (rtp_hd == NULL){return -1;}RTP_FIXED_HEADER *h = (RTP_FIXED_HEADER*)rtp_hd;h->version = 2;h->csrc_len = 0;h->extension = 0;h->padding = 0;h->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 codeif (int_len <=  MAX_RTP_PKT_LENGTH){memcpy(output, &intput[len], int_len - len);out_len = int_len - len;if (call_back){call_back(arg, output, out_len, 1);//send}}else{unsigned char type = intput[len] & 0x1F;unsigned char nri = intput[len] & 0x60;int_len -= len;fu[0] = 28;        /* FU Indicator; Type = 28 ---> FU-A */fu[0] |= nri;fu[1] = type;fu[1] |= 1 << 7; //startint offset = len + 1;int_len -= 1;int flag = 0;int count = (int_len - offset) / MAX_RTP_PKT_LENGTH;int left = (int_len -offset) % (MAX_RTP_PKT_LENGTH*count);if (left <= 12 && left > 0){flag  = 1;}while (offset + MAX_RTP_PKT_LENGTH + MAX_RTP_PKT_LENGTH*flag < int_len){memcpy(output, fu, 2);memcpy(&output[2], &intput[offset], MAX_RTP_PKT_LENGTH);out_len = MAX_RTP_PKT_LENGTH + 2 + RTP_HEADER_S_LEN;if (call_back){call_back(arg, output, out_len, 0);//send}offset += MAX_RTP_PKT_LENGTH;fu[1] &= ~(1 << 7);}fu[1] |= 1 << 6; //endmemcpy(output, fu, 2);memcpy(&output[2], &intput[offset], int_len - offset);out_len = int_len - offset + RTP_HEADER_S_LEN + 2;       if (call_back){call_back(arg, output, out_len, 1);}}return 0;
}

这段代码并不包含网络,是用回调函数来发送的,这样,有利于开发人员可以掌控,而且其实更好的方式是零拷贝,是可以做到的,这一段代码没有做,有兴趣的朋友可以看我另外一篇文章
如何零拷贝
rtp协议的重要性不言而喻,udp 作为逐渐登场的重要角色越来越重要,后面还有rtcp 和 fec ,前面错误纠正,这些实在通用的底层是程序员的核心。如果你想做一个普通的编码人员,最好是掌握核心的协议部分和算法部分,如果你想做管理人员,另当别论。

未完待续

webrtc 和 rtp 协议相关推荐

  1. WebRTC中RTP协议详解

    WebRTC中RTP协议详解 WebRTC中RTP协议详解 WebRTC中RTP协议详解 前言 一.RTP/RTCP在协议栈中的位置 1. RTP传输流程图 二.RTP Header 的结构图 1.R ...

  2. 从WebRtc学习RTP协议

    文章目录 TCP为何不适用于实时音视频 UDP->RTP RTP协议结构 Jittbuffer RTP扩展头 RTP填充数据 参考 TCP为何不适用于实时音视频 可靠性是以牺牲实时性为代价的.按 ...

  3. 开源实时音视频技术WebRTC中RTP/RTCP数据传输协议的应用

    1.前言 RTP/RTCP协议是流媒体通信的基石.RTP协议定义流媒体数据在互联网上传输的数据包格式,而RTCP协议则负责可靠传输.流量控制和拥塞控制等服务质量保证.在WebRTC项目中,RTP/RT ...

  4. RTP协议基本分析(RTSP、WebRTC使用)

    目录 1.介绍 2.RTP 3.格式 4.RTP打包H264 4.1.H264打包方式之Single NAL Unit 4.2.H264打包方式之FU-A 4.2.1.FU indication 4. ...

  5. 流媒体协议分析之webrtc之rtp

    1.   sps 及pps 封装格式: void yang_getConfig_Meta_H264( YangSample* psps, YangSample* ppps,uint8_t *confi ...

  6. RTSP+RTP协议剖析

    一.概述 RTSP(Real-time Steaming Protocol,实时流媒体协议)是由哥伦比亚大学.网景和RealNetworks公司提交的IETF RFC标准,编号RFC2326.RTSP ...

  7. WebRTC进阶-SDP协议详解

    文章目录 SDP结构 会话描述 会话创建者o 媒体描述 媒体信息 音频媒体信息 a=rtpmap a=fmtp 视频媒体信息 SSRC与CNAME PlanB与UnifiedPlan 网络描述 a=c ...

  8. 音视频传输:RTP协议详解和H.264打包方案

    问题背景: 前面讲解了PS.TS.FLV这三种媒体封装格式,现在新开一个系列讲解下传输协议,这里面会包含RTP.RTSP.HLS.RTMP等.当然最复杂的封装格式MP4在准备中,后面会把封装格式这个系 ...

  9. 自己动手写RTP服务器——关于RTP协议

    本文会带领着你一步步动手实现一个简单的RTP传输服务器,旨在了解RTP流媒体传输协议以及一些关于多媒体编解码的知识. 关于RTP协议的必备知识 要动手实现一个协议,当然首先需要阅读该协议的文档.RTP ...

最新文章

  1. 5大典型模型测试单机训练速度超对标框架,飞桨如何做到?
  2. 龙岗网络推广解析有关网站SEO排名上去了,但没实际性点击的问题
  3. kmalloc、vmalloc、malloc、calloc的区别
  4. GO 语言websocket编程
  5. 用最快速度,打造「最强 Webpack 前端工具链」,强势运行
  6. JSP response request 中文乱码
  7. linux c 进程策略 优先级,当两个线程拥有相同优先级时,linux c的线程调度策略问题...
  8. 时间序列的预处理之纯随机性检验
  9. 用JAVA FX制作3D魔方游戏
  10. Win10 启动项找不到ctfmon项,系统启动后无法输入文字怎么办?
  11. BMFont字体编辑器的使用
  12. Java实现小猪佩奇_一入java深似海(1-4期 完整版)
  13. 陈丹琦 关系抽取 2020 sota ner
  14. 华为擎云G540笔记本怎么U盘重装电脑系统详细教学
  15. statsby: 不用循环语句的循环
  16. abs、fabs、fabsf函数的用法区别
  17. 银行数据安全治理案例(一)——美创科技
  18. 我的世界未能从服务器注册表数据,【经验之谈】“User Profile Service 服务未能登录,无法加载用户配置文件”实战历程...
  19. 计算机科学的一个字节是几位,什么是字节--字节换算
  20. java一些必会算法(转自落尘曦的博客:http://blog.csdn.net/qq_23994787。 )

热门文章

  1. ab压力 failed_ab测试时结果显示大量Request failed的情况分析
  2. 快手宣布任命金秉为首席财务官 向程一笑汇报
  3. 阿里公布碳中和目标:2030年带动生态 15年减碳15亿吨
  4. 特斯拉电动皮卡量产时间还会推迟 内部人士称已被推迟到2023年
  5. 产业链人士:在台积电营收中,第一大客户苹果贡献超过20%
  6. 阿里影业授出1672.5万份购股权
  7. 小米折叠屏手机设计专利曝光:向内折叠 正面无开孔
  8. 苹果修改应用商店规则:云游戏服务可上架 但游戏需从商店下载
  9. 找工作的人太多导致平台崩了?BOSS直聘回应:系统故障 已修复
  10. 语C、耽美、盲盒、Lolita……这些95后文化,你看懂了吗?