刘敏慧,贺波涛
(1.武汉邮电科学研究院,湖北武汉430074;2.武汉烽火众智数字技术有限公司,湖北武汉430074)
随着我国经济和社会的发展,网络视频监控在城乡治安、交通等方面日益发挥着重要的作用,流媒体编解码和监控视频实时传输等技术是网络视频监控的关键技术[1]。从如今的编解码技术来看,被市场广泛采用的是H.264 标准,同时新一代的H.265 标准市场占比正在稳步提升,其优秀的视频压缩性能可以节约传输带宽和存储空间[2]。同时,网络视频监控[3]对实时的网络传输有很大需求[4],实时传输协议(Real-time Transport Protocol,RTP)[5]解决了该问题,RTP 可采用用户数据包协议(User Datagram Protocol,UDP)来实时传输数据,摄像头在采集到监控视频后,其H.265 码流会被封装在RTP信息包中,RTP 信息包被再次封装为UDP 的负载,最终封装在ip 数据包的负载中。文中研究的内容是如何从Wireshark 抓取的RTP 包中提取出H.265码流并保存,且实现该码流的高清流畅播放,保存的H.265 码流可用作关键帧的提取、转码及图像处理研究,具有较高的研究价值。
H.265 是继H.264 之后,由ITU-T VCEG 组织发布的新一代视频编码标准[6]。H.265 标准基于现有的H.264 视频编码标准[7],保留了一部分原有技术,同时改进了一些相关技术。新标准使用先进的技术来改善码流、编码质量、延迟和算法复杂度之间的关系,以实现最佳设置。具体研究内容包括提高压缩效率、提高鲁棒性和错误恢复能力、降低实时时延、降低信道采集时间和随机访问时延、降低复杂度[8]。HEVC[9]不仅提升视频质量,而且在相同的视频质量的情况下,相比H.264 实现了两倍的压缩率,同时可支持4K清晰度,甚至最高清晰度可达到8K(8 192×4 320)[10]。
H.265 码流[11]的图像帧序列由起始码(00 00 00 01 或00 00 01)、VPS、SPS、PPS、SEI、IDR 帧、P 帧、B帧、I帧等组成。
网络抽象层(Network Abstraction Layer,NAL)是H.265 视频编码标准的一部分,NAL 负责格式化视频数据并提供头信息,从而保证视频数据在各种信道和存储介质上的稳定传输。H.265 码流由一系列的NALU 组成,每个VPS、SPS、PPS、SEI、I 帧、P 帧都可以称为一个NALU,常见NALU 类型如表1所示。
表1 常见NALU类型
NALU 的结构为NALU 头+NALU 负载。H.265码流的NALU 头由两个字节组成,它的语法如图1所示。
图1 NALU结构/FU indicator结构
F:1 bit,forbidden_zero_bit,在H.265 规范中规定了这一位必须为0。禁止位0 表示正常,1 表示错误,一般都是0。Type:6 bit,nal_unit_type,常见NALU 类型如表1所示。LayerID:6 bit,nuh_reserved_zero_6bits,为0。TID:3 bit,nuh_temporal_id_plus1,为1。
从RTP 数据包中提取H.265 码流,首先需要抓取数据包。Wireshark 作为全世界最为流行的网络封包分析软件之一,可以抓取网络封包,并且尽可能地显示出最为详细的信息。抓取的数据包可以保存为pcap 格式[12]的文件,文中就是从包含已抓取数据包的pcap 文件中提取H.265 码流信息的[13]。pcap 文件的格式如图2所示。
图2 pcap文件格式
文中需要抓取的是携带着H.265 码流信息的RTP 数据包,抓取时不可避免地捕获ARP、TCP 等非必须数据包,可用Wireshark 本身的过滤规则来除去,也可在自制的提取码流方案中添加规则过滤。文中推荐使用第二种方法,该方法普适性更好,给研发人员的自主性更大,在提取时也不会因为个别包的疏漏而出现问题。
从pcap 文件中提取H.265 码流,需要获取H.265码流在网络传输时的打包方式。文中的H.265 码流在传输层采用的是UDP 协议,UDP 是开放式系统互联(Open System Interconnection,OSI)参考模型中的一种无连接的传输层协议。相比于传输层另一种协议——传输控制协议(Transport Control Protocol,TCP),UDP 虽然提供不可靠的信息传输服务,但它额外开销小、时延短、无连接,非常适合多媒体数据流的传输,在文中情况下,UDP 也是个好选择[14]。
RTP 协议[15]规定了在互联网上传输视频和音频的标准数据包格式,它创建在UDP 之上,并与之结合使用,方便RTP 使用其端口号和效验服务,依托UDP低传输时延的特点,更好地匹配视频传输业务。
RTP 包由包头和负载两部分组成[16],H.265 码流数据存储在RTP 数据包的负载中,其包头中存储了负载类型(payload typePT)、序列号(Sequence Number)、时间戳(Timestamp)、同步源标识符(SSRC)等信息,包头的信息不是必要的,在设计时可以直接偏移12 字节到负载部分。
在以太网中,数据链路层能够确定发送的一个数据包的最大长度称为最大传输单元(Maximum Transmission Unit,MTU),为1 500 字节,文中采用的监控视频的分辨率是1 920×1 080,由于通过H.265标准压缩后的每帧图像远远超过1 500 字节,因此为了实现H.265 码流在网络上的传输,必须对每帧图像进行分割再打包成适合在以太网上传输的大小合适的RTP 数据包。
上文已知H.265 码流由一系列的NALU 组成,每个VPS、SPS、PPS、SEI、I 帧、P 帧都可以称为一个NALU,不同类型的NALU 之间大小差距很大[17]。对于VPS、SPS、PPS、SEI 等小于MTU 的NALU,打包时只需将该NALU 去掉起始码并添加在RTP 包头后即可。对于I 帧、P 帧等大于MTU 的NALU,使用FU 打包,就是将一个NALU 分片打包成几个RTP 数据包,即fragmentation unit,简称FU。每个分片单元为12字节的RTP 包头和2 字节的FU indicator、1 个字节的FU Header 及被分割的H.265 码流段的组合。RTP 包负载结构如图3所示。
图3 RTP负载结构
首先分析FU indicator 结构,如图1所示,与上文NALU 头的格式完全一致。F:1 bit,为禁止位,通常情况下为0。Type:6 bit,表示的是分片封包的类型,NALU 的Type 表示当前NALU(帧)的类型,在文中为49。LayerId 为0,TID 为1。如图4所示,FU Header 结构中,S:1 bit,开始位,若为1 表示分片NAL 单元的开始。若跟随的FU 负载不是分片NALU 的首个包,则开始位为0。E:1 bit,结束位,若为1,则表示分片NALU 的结束,即跟随的FU 负载是分片NALU 的最后一个包,当跟随的FU 负载不是分片NALU 的最后分片时,结束位设为0。此结构中的Type 表示被分片的原始图像帧的类型,注意与FU indicator 中的Type 相区别。
图4 FU Header结构
文中抓取的RTP 数据包存储在pcap 文件中,若要提取RTP 数据包负载的H.265 码流,则需要去掉不需要网络传输中添加的各种头信息,如pcap 文件头、pcap 数据包头、数据链路层头、ip 头、UDP 头、RTP 头等,并为每个NALU 恢复起始码及分片包的原始NALU 头。
根据图5,在用UDP 头的src_port 来判定是否为文中所需数据包时,需要先做一些准备工作,根据图2pacp 文件结构解析,为了获得负载上的H.265 码流数据,首先将pcap 文件的24 字节文件头去掉,对于单个pacp 的数据包n,需去掉数据包头n,使用包头信息的caplen 项作为遍历指针的偏移依据,以实现对每个pcap 数据包负载的遍历。
图5 pcap文件中的H.265码流提取
通过src_port 确定了是否为所需RTP 包,若为假则继续遍历pcap 文件,若为真则开始写H.265 输出文件。首先写入起始码,判断该RTP 包是否为分片包,若为假,则直接将RTP 负载写入输出文件;若为真且为图像帧的首个分片包[18],则将FU indicator 的Type 位清零,并与FU Header 的Type 位组合为新的NALU 头,将其写入H.265 输出文件。去掉RTP 数据包的RTP 头和FU 分片头,将剩余的负载部分写入H.265 输出文件,若非图像帧的首个分片包,则只需去掉RTP 数据包的RTP 头和FU 分片头并将RTP数据包的剩余部分写入H.265 输出文件,每处理完一个RTP 数据包就继续遍历pcap 文件,直至文件结束。
提取H.265 视频完成后可用ffplay 进行播放,直接用VLC 多媒体播放器(Video LAN Client,VLC)拉流播放的效果如图6所示。文中提取的H.265 码流播放效果如图7所示,由图7可看出,图像质量已还原成摄像头直接采集的播放效果。
图6 VLC拉流播放效果
图7 文中提取的H.265码流播放效果
文中通过对H.265 码流结构、RTP 打包方式、pcap 文件格式及数据包在以太网上的传输的剖析,设计并实现了从网络上抓取H.265 码流并将其从保存的pcap 文件中提取出来,提取成功的H.265 码流文件可用作标准H.265 序列,也可以用来提取I 帧、B帧等,利于对单帧图像进行研究。在工程上,该提取视频的实现方法能为广大的视频开发人员提供一些参考,便于分析RTP 包和视频帧序列。对于广大视频用户来说,每次视频方面研究的完成,都预示着将来更清晰、更高帧率、更小带宽的视频服务。