第二章、FFmpeg增加RTP协议外部扩展信息解析
RTP协议
RTP协议格式:
1.V:RTP协议的版本号,占2位,当前协议版本号为2。
-
P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。
-
X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头。
-
CC:CSRC计数器,占4位,指示CSRC 标识符的个数。
-
M: 标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。
-
PT: 有效载荷类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等,在流媒体中大部分是用来区分音频流和视频流的,这样便于客户端进行解析。
-
序列号:占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1。
应用场景:对视频进行无变形缩放选定要裁剪的坐标点、对应的宽高进行裁
RTP头部协议,前12位为基础字节,对应第一个结构体,如果extension为1时候,才有外部扩展信息,外部扩展信息结构对应第二个结构体,分别对应profile、length、data。
FFmpeg源码分析
第一步打开ffmpeg-5.1源码,搜素rtpdec.c文件找对应的方法
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
const uint8_t *buf, int len)
从上图说明过滤的RTP协议外部扩展信息
为什么要增加RTP协议外部信息解析
1、因为一般直播、视频通话、转拉流视频选择角度会放在外部协议
判断是否有外部协议的语句
int extension = (buf[0] & 0x10) >> 4;
下面是我修改方式,主要判断是否视频角度,saveRtpData方法是我自己写的,经过验证上线过可以的,有提供rtp_parse_packet_internal源码参考
修改源码增加修改的部分可以参考,我思路把获取rtp协议的的视频角度pkt->pos传递出去,再传给上下文,后面的代码要自己去写
static int parse_rtp_extension(const uint8_t* buf,int ext_len,int len,int id){
int offset=0;
int extension_data=-1;
int identifier = (buf[4] >> 4) & 0x0f;
if(identifier==id){
int extension_length = AV_RB16(buf +2);
if(extension_length==1){
extension_data = (buf[5] & 0x0f); // Identifier
switch (extension_data) {
case 0:
extension_data=0;
break;
case 1:
extension_data=90;
break;
case 2:
extension_data=180;