HDMI视频流无线传输系统的设计与实现
扫描二维码
随时随地手机看文章
引 言
在当前物联网技术浪潮的推动下,物与物相连的需求快速增长,而多媒体信息特别是视频信息因其数据量大的特点, 一直是通信领域的研究热点。在应用方面,智能家居、智能会议室、智能教学等系统得到了不断推广,而音视频的局域网内传输技术始终扮演着智能系统的重要角色。虽然传统的有线传输方式能提供高质量的音视频传输效果,但在实际应用中人们常常囿于布线困难,因而提出无线传输的需求。目前,市场上的音频无线传输方案已经相对成熟,其媒介选择有 U 段无线、WiFi、蓝牙等。相比而言,无线视频的发展相对缓慢, 因为其开发难度和开发成本都相对较大。尽管如此,无线视频的需求依然是市场的热点。比如安防专用的摄像头无线监控系统,拍摄专用的无人机拍摄无线传输系统,教学或会议专用的无线视频投影应用等。
无线视频传输应用中的视频源和接收端在不同场景中各有不同。例如教学或会议中的无线投影,其视频源可来自个人电脑的HDMI 输出或VGA 输出,接收端则一般是投影仪的HDMI 端口或VGA 端口。由于HDMI 标准对高清视频的支持较好,因此在高质量视频传输中,研究 HDMI 视频流的无线传输方案具有很好的应用价值。
对于视频数据,未经压缩的原始视频数据量是无线传输难以承受的,尤其对于高清晰度视频,大数据量的无线传输将导致系统传输方案的成本大大增加[1]。因此对HDMI视频流的无线传输必须引入合适的编码方案,平衡编码效果和无线通信容量之间的矛盾,达到低延时的播放效果 [2]。为解决上述问题,本文采用S5PV210 处理器,以 ADV7611 接收HDMI 视频流,然后通过硬件编码器进行视频编码,再由处理器打包无线发送 ;接收端接收到视频数据后解码视频,并由HDMI 接口输出。
1 系统整体硬件方案设计
图 1所示为高清视频无线传输的系统原理及实现结构图。系统分为发送端和接收端两部分,这两部分是独立的系统, 可以使用一个发送端和一个接收端进行一对一工作,也可以使用一个发送端和多个接收端同时工作,或者多个发送端和一个接收端分时连接工作,这些都可以在软件应用层实现。底层的编解码和无线通信架构相同,为了描述方便,在此以一个发送端对一个接收端作为描述实例。
由图 1 可知,发送端包括视频接收前端模块和编码发送模块。视频接收前端主要由ADV7611 实现HDMI 视频流的输入,并将视频数据转为YCbCr 信号,通过板上总线传输到编码发送模块。编码发送模块主要是S5PV210 处理器,通过处理器内部的多格式编解码器(Multi Format Codec,MFC)对视频进行压缩。压缩后的视频由RTP 协议发送,通过物理层WiFi 实时传输到接收端[3]。解码端将视频流解码,获取LCD 设备的缓存区视频流数据,将HDMI 流以 HDMI 流媒体的形式输出。
在应用方面,上述系统的发送端通过HDMI 接口接收电脑或视频播放器等视频源的输出,而接收端也通过HDMI 接口连接投影仪或显示器等设备,实现 HDMI 视频流的无线传输。
2 系统软件设计
2.1 系统配置
系统配置包含 Linux 系统内核配置与对ADV7611 的配置。根据系统需求,ADV7611 与S5PV210 之间以 ITU601 的格式传输视频数据,因此在Linux 内核中需要修改视频输入驱动为ITU601 格式,并设置好 YCbCr 数据的顺序格式,例如 CbYCrY 等。这两个参数在内核中的结构体 s2c_platform_ camera 定义。对ADV7611 的寄存器配置则是在应用程序中通过I2C 驱动实现,具体参数可根据需求按芯片文档说明设定。
2.2 视频编码
为了实现大数据量高清视频的无线传输,平衡视频效果和无线通信容量之间的矛盾,系统对 HDMI 接收器得到的视频流进行实时压缩,通过减少和去除冗余视频数据的方式, 达到可靠发送的目的[4]。为了达到低延时的播放效果,可以充分利用S5PV210 中集成的MFC 硬件编码模块,以减轻处理器的计算量。MFC 是ARM 微处理器内部一种支持多种硬件编码方式的硬件电路,视频编码支持 MPEG-4、H.263 以及H.264,分辨率可达到 1 080P@30fps。本文选用H.264 的编码方式。
图 2 所示为MFC 硬件编码流程图。MFC 硬件编码在程序实现中定义了三个函数,分别为初始化函数,执行函数和句柄释放函数,利用这三个函数即可实现整套编码操作。初始化函数的作用是对整个MFC 的参数进行设置。打开设备节点, 进行内存到应用的内存映射,初始化关于 MFC 设备的结构体, 并提供相应的参数,把 _MFCLIB_H264_ENC 参数传入MFC 跟深层次的结构体当中,通过 ioctl 函数把参数传入内核。
初始化 MFC 之后读取视频流,得到输入图像的地址缓冲指针,等待缓冲区成像数据。成像后读取一帧视频数据,并将这一帧数据放入MFC 编码,第一次的编码需要传入配置参数。编码完成后得到H.264 编码格式的网络提取层(Network Abstraction Layer,NAL)数据。因为系统采用RTP 协议进行网络数据传输,对于一帧图像的NAL 数据需要根据 RTP 网络数据的帧长度进行分片,分片后的视频数据添加载荷头FU-A 打包,添加RTP 包头并向客户端发送一帧视频数据。之后系统重新读取一帧视频数据再进行MFC 编码。
为了方便描述没有显示编码过程的退出机制,实际程序中根据具体需求以合适的方式退出编码,释放句柄,解除映射。
2.3 无线传输
编码后的视频以 RTP 协议在局域网传输。为了实现点对点或点对多点的视频传输,发送端利用WiFi 网卡实现软接入点的功能。因此多个接收端可以同时连接到发送端的接入点,从而访问RTP 服务获得视频数据。对于多个发送端对一个接收端的情况,可以设定接收端为WiFi 接入点,发送端连接到接收端再进行数据传输,但是在应用中各发送端只能以时分复用的形式将数据发送到接收端。
2.4 视频解码
解码器对发送来的H.264 等压缩格式的视频数据包进行实时解码,通过采用相应的解压缩算法还原视频的高清晰度, 转化为可播放的非压缩视频流格式。FFMPEG 是一个集音视频编解码在内的多种功能为一体的开源解决方案,支持H.264 在内的 40 多种编码和 70 多种解码[5]。解码端利用FFMPEG 库解码,主要涉及libavcodec 库、libswscale 库和libavformat 库[6]。视频数据流解码流程 :由 ByteIOContext 表示的广义输入文件,在 AVStream 提供的特定文件容器流信息的指引下, 用AVInputFormat 接口的 read_packet() 函数读取完整的一帧数据,分别放到音频或视频 PacketQueue 队列中,这部分功能由独立的解码线程完成。对于视频数据,视频处理线程不停从视频 PacketQueue 队列中取出视频帧,调用AVCodec 接口的decode() 函数解码视频帧,在适当延时后做颜色空间转化并调用显示输出函数库显示出来。
3 功能测试
为了验证系统的功能和效果,本节搭建一发一收的演示系统,其实物图如图 3 所示。
发送端由ADV7611 的视频前端测试板接收笔记本电脑输出的HDMI 视频流,然后通过ITU-R.BT601 标准接口将转码得到的YCbCr 数据传输到S5PV210 开发板进行硬件编码。发送端 S5PV210 开发板配置了 WiFi 的软接入点,并与接收端建立无线连接,同时开启视频 RTP 传输服务,支持编码后的视频数据发送服务。
接收端硬件只需提供WiFi网卡和HDMI 视频输出接口。接收端处理器通过网卡连接到发送端接入点,然后由RTP 客户端软件获取发送端的视频数据,将视频数据解码后由HDMI接口输出。
由图 3 可知,笔记本电脑直接复制屏幕并输出到HDMI 接口;HDMI 接口的视频流输入发送端 S5PV210 开发板; S5PV210 开发板将视频压缩编码后通过无线连接发送给接收端;接收端将视频解码输出到 HDMI 接口,并最终输出到显示器显示。
图 3 无线视频传输系统
4结 语
本文针对HDMI 视频流给出了一种无线视频传输系统的设计方案。该方案将传输系统分为发送端和接收端两个独立模块,可以灵活配置为一发一收、一发多收、多发一收等应用场景。系统采用硬件编码的方式实现了在无线传输条件下的视频清晰度和视频传输延时的优化。针对该方案,可以从进一步提高视频清晰度着手,因为S5PV210 的硬件编码模块在1 080P 的输入分辨率时最高支持的帧率为 30 fps,而很多高清视频源可达 50/60 fps。因此可以在帧率提高方面进行研究, 或对更高分辨率如 2 160 P 的视频处理进行研究。