Rtmp 数据流转h264 的详细转码过程 一、 目的: 这段时间,因为工作上的需要,在RTMP 上做了flv 流到标准h264、 AAC 的转换。 二、 RTMP 介绍: RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe Systems 公司为Flash 播放器和服务器之间音频、视频和数据传输开发的私有协议。 RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是 FLV 中的视/音频数据. 它有三种变种: 1)工作在TCP 之上的明文协议,使用端口1935; 2)RTMPT 封装在 HTTP 请求之中,可穿越防火墙; 3)RTMPS 类似RTMPT,但使用的是HTTPS 连接; Rtmp 详细介绍请参照网上文档(一搜一大把) 三、 Rtmp 流转h264 基于rtmp client 端收取的数据包packet 进行解码。 1、 在 rtmp 传输数据流的时候,不论是在点播情况下或者直播情况下,rtmpserver 会在流开始的时候添加File Header 和 MedadataTag。这些不需要分析。 2、 数据头解析 2-1、 Tagtype,一字节 每个packet 的第一个字节代表了当前packet 的类型。0x04 表示Ping 包,0x08为 audio,0x09 为 video。0x12 为 script data。0x16 比较特殊,这个是为了实现H.264数据的直播而增加了一个数据类型。这个之后特别讨论。 2-2、 Datasize, 24bit 这三个字节表述了tag 中数据段的大小。 2-3、 Timestamp, 24bit 记录了每一个tag 相对于第一个tag( File Header)的相对时间。以毫秒( milliseconds)为单位。而File Header 的 timestamp 永远为0。 2-4、 TimestampExtended, 8bit 扩展时间字段,此字段与timestamp 字段共同组成完整的时间戳字段,只不过Timestamp 是这个字段的低24 位,TimestampExtended 为这个字段的高8 位。 2-5、StreamID,24bit 永远都是 0。 2-6、Data,大小是 Datasize Tag body。存储音视频信息等。 如果, Tagtype==0x08,Data 为 audiodata。 Tagtype==0x09,Data 为 videodata。 Tagtype==0x12,Data 为 scriptdataobject。 Tagtype==0x16,Data 为 H264 直播流数据包。 3、 对 rtmp 音频数据的解析(audio tag) 不难看出 rtmp 中 flv 音频流就是一个接着一个的 Audio tag。每次传输流的第一个 audio tag 标示了音频使用的 adts header 信息,即 AAC header(audiodata),占据前 3 个字节。之后根据标志位的不同,分 AAC s...