浅谈多平台音视频同屏开发技术
四川湖山电器股份有限公司 陈柯宇
引言
音视频同屏处理作为一项核心基础的关键技术被广泛应用于无纸化会议、课堂教学系统等多媒体融合应用场景中。音视频同屏技术本身也集中了音视频采集、编解码和网络传输等多领域的技术,内容丰富多样。随着应用范围的不断增加,特别是国产化主机和操作系统平台的应用普及不断推进,音视频同屏处理技术需要适配应用于各种异构平台上,这一诉求更加丰富了音视频同屏技术的涵盖范围。
本文结合本公司产品实践,结合较为当前企业级应用较为主流Windows和Linux操作系统平台,提出了适用于指定平台的端到端音视频同屏技术方案。
系统架构设计
系统架构由以下几个主要节点组成:
1. 同屏推送端
采集本地设备的音视频数据,对音视频数据进行编码压缩,将编码压缩后的音视频数据流推送到流媒体服务器。
2. 流媒体服务器
对来自同屏推送端的音视频数据流进行转发,目前已经有一些成熟、开源的流媒体服务器软件项目可用,例如:ZLMediaKit、RTMP Nginx等。
ZLMediaKit是应用广泛的流媒体服务器,支持RTSP、RTMP、HTTP、HLS、MPEG-TS等多种协议,可以实现音视频的推流、转码、录制、播放等功能。具有高性能、低延迟、易扩展等特点,适用于直播、视频会议、监控等场景。ZLMediaKit可以运行在Linux、Windows等操作系统上,支持多种硬件平台。
3. 播放端
从流媒体服务器拉取音视频数据流,对音视频数据进行解码,将解码后的音视频数据播放渲染以呈现给最终用户。
因为流媒体服务器已有较多现成软件项目可用,所以本文主要说明同屏推送端和播放端的开发实现技术,对于流媒体服务器不再赘述。
实现流程
一、同屏推流端
同屏推流端完成的功能包括:
1. 屏幕截图
屏幕截图功能包括对鼠标、光标位置和形状的捕获。
(1)Linux系统的获取屏幕图片方法:
A. framebuffer方式
访问由显卡显存映射(mmap)的内存帧缓冲区,使用特殊的设备节点:/dev/fb*。framebuffer是一种比较老的渲染方式,因为只能实现简单的整张位图输入输出,需要耗费较多的CPU处理,目前仅仍然在一些输出简单显示界面或者对显示性能要求不高的嵌入式设备上使用。现代Linux系统在X Window System加载后便将其接管,相应地,这种获取屏幕图片方式也就失效。
B. OpenGL方式
一种跨平台的图形编程接口,在Linux系统中最终仍然是通过X Window System的协议库Xlib实现各种图形操作。
C. XCB方式
X Window System由MIT在1984年发布的一种窗口系统,广泛使用于类UNIX操作系统上。X包括X server和X client,它们之间通过X协议通信。X server接收X client的显示请求,调用底层的显示设备驱动程序,输出到显示设备上;同时,把输入设备的输入事件,传递给相应的X client。X协议是网络透明的,server和client可以位于同一机器上、同一操作系统中,也可以位于不同机器、不同操作系统中(因此X是跨平台的)。这为远端GUI登录提供了便利。X client的实现上将X协议封装为命令原语,以库的形式(xlib或者xcb)向外部应用提供接口。外部应用作为X client调用这些API,向X server发起请求。X server的实现几经演变为现在的Xorg。目前的主流版本是X11R6(R7)。
这也是目前在Linux系统常用的获取屏幕截图方式。
(2) Windows系统的获取屏幕图片方法:
A. GDI方式
在Windows10以前的版本使用GDI (Graphics Device Interface)接口从系统中获取屏幕截图,但这种方式性能比较差,获取操作的耗时经常超过40ms,无法保证25帧的截图速率,也就无法保证同屏视频的流畅性,视觉效果不是太好。
B. DXGI方式
DXGI (Microsoft DirectX Graphics Infrastructure ) 是随 Windows Vista 引入的新子系统,从Windows10开始可以通过DXGI接口从系统中获取屏幕截图,耗时大幅缩短,能够保证25帧的截图速率,大幅提升了同屏视频的视觉效果。
2. 声音采集
声音采集功能用于获取本机上其他应用产生的声音。
(1)Linux系统的采集声音方法:
A. OSS声卡系统
OSS(Open Sound System)是一个类Unix和POSIX兼容系统上一个可选的声音架构,提供了源代码级的可移植性。OSSv3是Linux下原始的声音系统并集成在内核里,但是OSSv4在2002年OSS成为商业软件时它的地位被ALSA所取代。OSSv4在2007年又成为开源软件,4Front Technologies以GPL协议发布了它的源码。OSS的设备节点在/dev目录下,类型为字符设备,其主设备号为14:/dev/dsp: Digital audio。
B. ALS声卡系统
ALSA提供了Playback和Capture两种方式对声卡进行操作,应用程序通过asound库调用ALSA对声卡进行操作,但在默认情况下Capture方式只能对声卡的输入通道进行采集,不能进行内录。
通过配置ALSA环回(Loopback虚拟声卡)路由,将真实的物理声卡和Loopback输入通道合并为一个逻辑声卡设备,实现对Loopback输出通道进行采集。
(2)Windows系统的采集声音方法:
使用MMDevice API来枚举和获取指定设备,用WASAPI来处理应用程序和音频设备之间的音频流数据。
3. 音视频编码
音视频编码功能将屏幕截图的bmp数据编码压缩成H264/H265数据,将声音采集的pcm数据编码压缩成G711/aac/mp3等格式数据。
使用最为广泛的音视频编解码开源软件项目是ffmpeg, 这是一套可以功能强大、可运行于很多软硬件平台的音视频处理软件,支持几乎市面上绝大多数音视频编解码、采集、转码、记录、推拉流等处理,支持Intel QSV、Linux VAAPI、Android MediaCode等硬件编解码处理增强。同时,ffmpeg也可由开发者自行开发代码对接新的编解码协议、实现和硬件编解码增强。
4. 音视频传输
音视频传输功能将编码压缩后的音视频码流数据通过网络传输协议推送给流媒体服务器,常用的网络传输协议包括:RTMP、RTP、RTSP、HLS等。
A. RTP/RTCP
RTP/RTCP(Real-time Transport Protocol, RTP Control Protocol)用于在网络中传输音视频数据的IETF RFC标准协议,可工作在TCP或UDP上,可单播也可组播,通常和RTCP一起使用。
B. RTSP
RTSP(Real Time Streaming Protocol)是哥伦比亚大学、Netscape和RealNetworks公司提交的IETF RFC标准。RTSP在体系结构上位于RTP/RTCP之上,语法和HTTP 1.1类似,默认使用端口号554或8554。RTSP控制消息协商完成后可使用RTP/RTCP传输流媒体数据。
常用的RTSP客户端和流媒体转发服务器有:live555、ZLMediaKit。
C. RTMP
RTMP(Real Time MessagingProtocol)是Adobe公司为Flash播放器和服务器之间音视频数据传输开发的开放协议。工作在TCP之上,默认使用端口号1935,并衍生出:RTMPE、RTMPT、RTMPS。可实现主动推送,常用的RTMP流媒体转发服务器有:Nginx(rtmp-module)、SRS、ZLMediaKit。
D. HLS
HLS(HTTP Live Streaming)是苹果公司基于 HTTP 的流媒体传输协议,主要应用于 iOS 设备提供音视频直播和点播服务。
结合前述的介绍,同屏推流端在Linux操作系统的软件架构如下图所示:
同屏推流端在Windows操作系统的软件架构如下图所示:
上图中左右边分别表示视频和音频数据在同屏推流端中的数据流。
二、 播放端
播放端的实现方案相对比较简单,完成的功能包括:
1. 音视频传输
音视频传输功能通过网络传输协议从流媒体服务器拉取编码压缩的音视频码流数据,常用的网络传输协议包括:RTMP、RTP、RTSP、HLS等,和同屏推流端使用的协议一致。
2. 音视频解码
音视频解码功能将编码压缩的H264/H265、G711/aac/mp3码流数据解码还原成YUV或BMP数据。常用的软件开源项目除了前述的ffmpeg,还有libyuv等。
3. 音视频渲染
音视频渲染功能渲染呈现解码后的视频图像,播放解码后的音频。
(1) 常用的视频图像渲染方式:
A. OpenGL
OpenGL是一种跨平台的图形编程接口,能够充分利用GPU的强大处理能力,实现图像和图形的各种渲染显示。相比较简单地由软件绘图方式呈现每一帧解码后的BMP或YUV数据,使用OpenGL能降低CPU占用率,提升整体性能和呈现效果。
B. SDL
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,提供了跨平台的图像、声音控制功能,SDL的底层也能通过OpenGL实现图像渲染显示的功能。
(2) 常用的音频播放方式:
A. SDL
B. 直接调用系统原生的声音播放API
因为这种方式需要分别调用不同操作系统的声卡处理API,且需要配置很多参数,所以不推荐使用这种方式。
总结
本文完整地阐述和说明了Windows和Linux平台下的音视频同屏技术解决方案,尤其是针对不同平台的几种常见主流处理技术进行了讨论和比较。音视频技术的发展非常迅速,新的编解码技术标准、传输协议和操作系统底层软件驱动框架也在不断发展演变,我们也会持续跟进。