做视频会议,用RTMP协议,就要把视频流封装成flv包。
最近几星期一直在纠结怎么封装,终于让我找到规律了。
首先下载一个flvparse软件。来分析flv的帧数据。打开软件,点浏览选择路径打开flv文件可以得到下图:
上图打开的是一个好的flv文件,就是封包格式是正确的,我们可以来分析和观察一下。
File Header和 MedadataTag是rtmp协议自动添加上的数据,所以不用我们来分析。(当然如果你又需求要自己编写rtmpclient的话这些数据也需要你自己添加,目前我使用的是java版的rtmpclient。个人感觉太臃肿了,尤其是跑在android平台上,所以后期我可能会修改一下这个rtmpclient。)
下面回归正题,我们从第一帧开始分析。上图青绿色部分就是第一帧的数据了。前面10个数据也是在rtmpclient中添加的。09 00 00 2C就是视频数据相关。00 00 00 00是时间戳。在后面2个00 00我目前还没有研究。17 00 00 00 00就是帧类型。这个类型是第一帧的代表,也就是在这帧里面插入sps pps等信息。
紧接着在帧类型到最后一位中的数据就是avc中的数据了,就是视频的一些参数。具体内容可以参考这个帖子http://blog.csdn.net/peijiangping1989/article/details/6934312
只有第一帧才是17 00 00 00 00哦。在数据后面跟着4位数据为数据的长度。00 00 00 37也就是这个第一帧的长度了。
下面我们点击第2帧。如图:
可以看到前面10位数据大致相同。同时时间戳也发生了变化。这个先不管。帧类型大家可以看到第2帧的是 27 01 00 00 00。这说明这帧是p帧。就是不是关键帧。
但是在后面不是紧跟着数据了00 00 00 DA代表的是后面数据的长度,不是整个帧的长度哦是从DA 以后数据,也就是裸数据的长度,在41到F0就是裸数据了。
这里我来说下怎么分析是不是关键帧其实很简单只要裸数据第一个数据是41就不是关键帧,是65才是关键帧。关键帧的数据类型是 17 01 00 00 00.
同样在裸数据后接着4为帧长度,就只要一直下去,当遇到是65就插入17 01 00 00 00为关键帧,41就27为P帧。只要就完成了flv文件的格式。和封包。
$(document).ready(function(){dp.SyntaxHighlighter.HighlightAll('code');});
原文链接: http://blog.csdn.net/peijiangping1989/article/details/6999224