音视频同屏处理作为一项核心基础的关键技术被广泛应用于无纸化会议、课堂教学系统等多媒体融合应用场景中。音视频同屏技术本身也集中了音视频采集、编解码和网络传输等多领域的技术,内容丰富多样。随着应用范围的不断增加,特别是国产化主机和操作系统平台的应用普及不断推进,音视频同屏处理技术需要适配应用于各种异构平台上,这一诉求更加丰富了音视频同屏技术的涵盖范围。
本文结合本公司产品实践,结合较为当前企业级应用较为主流Windows和Linux操作系统平台,提出了适用于指定平台的端到端音视频同屏技术方案。
采集本地设备的音视频数据,对音视频数据进行编码压缩,将编码压缩后的音视频数据流推送到流媒体服务器。
对来自同屏推送端的音视频数据流进行转发,目前已经有一些成熟、开源的流媒体服务器软件项目可用,例如:ZLMediaKit、RTMP Nginx等。
金年会娱乐平台登录
ZLMediaKit是应用广泛的流媒体服务器,支持RTSP、RTMP、HTTP、HLS、MPEG-TS等多种协议,可以实现音视频的推流、转码、录制、播放等功能。具有高性能、低延迟、易扩展等特点,适用于直播、视频会议、监控等场景。ZLMediaKit可以运行在Linux、Windows等操作系统上,支持多种硬件平台。
从流媒体服务器拉取音视频数据流,对音视频数据进行解码,将解码后的音视频数据播放渲染以呈现给最终用户。
因为流媒体服务器已有较多现成软件项目可用,所以本文主要说明同屏推送端和播放端的开发实现技术,对于流媒体服务器不再赘述。
访问由显卡显存映射(mmap)的内存帧缓冲区,使用特殊的设备节点:/dev/fb*。framebuffer是一种比较老的渲染方式,因为只能实现简单的整张位图输入输出,需要耗费较多的CPU处理,目前仅仍然在一些输出简单显示界面或者对显示性能要求不高的嵌入式设备上使用。现代Linux系统在X Window System加载后便将其接管,相应地,这种获取屏幕图片方式也就失效。
一种跨平台的图形编程接口,在Linux系统中最终仍然是通过X Window System的协议库Xlib实现各种图形操作。
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)。
在Windows10以前的版本使用GDI (Graphics Device Interface)接口从系统中获取屏幕截图,但这种方式性能比较差,获取操作的耗时经常超过40ms,无法保证25帧的截图速率,也就无法保证同屏视频的流畅性,视觉效果不是太好。
ALSA提供了Playback和Capture两种方式对声卡进行操作,应用程序通过asound库调用ALSA对声卡进行操作,但在默认情况下Capture方式只能对声卡的输入通道进行采集,不能进行内录。
通过配置ALSA环回(Loopback虚拟声卡)路由,将真实的物理声卡和Loopback输入通道合并为一个逻辑声卡设备,实现对Loopback输出通道进行采集。
使用MMDevice API来枚举和获取指定设备,用WASAPI来处理应用程序和音频设备之间的音频流数据。
音视频编码功能将屏幕截图的bmp数据编码压缩成H264/H265数据,将声音采集的pcm数据编码压缩成G711/aac/mp3等格式数据。
使用最为广泛的音视频编解码开源软件项目是ffmpeg, 这是一套可以功能强大、可运行于很多软硬件平台的音视频处理软件,支持几乎市面上绝大多数音视频编解码、采集、转码、记录、推拉流等处理,支持Intel QSV、Linux VAAPI、Android MediaCode等硬件编解码处理增强。同时,ffmpeg也可由开发者自行开发代码对接新的编解码协议、实现和硬件编解码增强。
音视频传输功能将编码压缩后的音视频码流数据通过网络传输协议推送给流媒体服务器,常用的网络传输协议包括:RTMP、RTP、RTSP、HLS等。
HLS(HTTP Live Streaming)是苹果公司基于 HTTP 的流媒体传输协议,主要应用于 iOS 设备提供音视频直播和点播服务。
音视频传输功能通过网络传输协议从流媒体服务器拉取编码压缩的音视频码流数据,常用的网络传输协议包括:RTMP、RTP、RTSP、HLS等,和同屏推流端使用的协议一致。
音视频解码功能将编码压缩的H264/H265、G711/aac/mp3码流数据解码还原成YUV或BMP数据。常用的软件开源项目除了前述的ffmpeg,还有libyuv等。
OpenGL是一种跨平台的图形编程接口,能够充分利用GPU的强大处理能力,实现图像和图形的各种渲染显示。相比较简单地由软件绘图方式呈现每一帧解码后的BMP或YUV数据,使用OpenGL能降低CPU占用率,提升整体性能和呈现效果。
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,提供了跨平台的图像、声音控制功能,SDL的底层也能通过OpenGL实现图像渲染显示的功能。
因为这种方式需要分别调用不同操作系统的声卡处理API,且需要配置很多参数,所以不推荐使用这种方式。
本文完整地阐述和说明了Windows和Linux平台下的音视频同屏技术解决方案,尤其是针对不同平台的几种常见主流处理技术进行了讨论和比较。音视频技术的发展非常迅速,新的编解码技术标准、传输协议和操作系统底层软件驱动框架也在不断发展演变,我们也会持续跟进。