网站进行了升级,有所变化,请使用 搜索 查找更多内容

浅谈多平台音视频同屏开发技术(二)

山东秋妍信息科技有限公司 2026-01-14 13:22:06 67 0

实现流程

一、同屏推流端

同屏推流端完成的功能包括:

1.屏幕截图

屏幕截图功能包括对鼠标、光标位置和形状的捕获。

(1)Linux系统的获取屏幕图片方法:

A. framebuffer方式

访问由显卡显存映射(mmap)的内存帧缓冲区,使用特殊的设备节点:/dev/fb*。framebuffer是一种比较老的渲染方式,因为只能实现简单的整张位图输入输出,需要耗费较多的CPU处理,目前仅仍然在一些输出简单显示界面或者对显示性能要求不高的嵌入式设备上使用。现代Linux系统在XWindowSystem加载后便将其接管,相应地,这种获取屏幕图片方式也就失效。

B.OpenGL方式

一种跨平台的图形编程接口,在Linux系统中最终仍然是通过XWindowSystem的协议库Xlib实现各种图形操作。

C.XCB方式

XWindowSystem由MIT在1984年发布的一种窗口系统,广泛使用于类UNIX操作系统上。X包,括Xserver和Xclient,它们之间通过X协议通信。Xserver接收Xclient的显示请求,调用底层的显示设备驱动程序,输出到显示设备上;同时,把输入设备的输入事件,传递给相应的Xclient。X协议是网络透明的,server和client可以位于同一机器上、同一操作系统中,也可以位于不同机器、不同操作系统中(因此X是跨平台的)。这为远端GUI登录提供了便利。Xclient的实现上将X协议封装为命令原语,以库的形式(xlib或者xcb)向外部应用提供接口。外部应用作为Xclient调用这些API,向Xserver发起请求。Xserver的实现几经演变为现在的Xorg。目前的主流版本是X11R6(R7)。这也是目前在Linux系统常用的获取屏幕截图方式。

(2)Windows系统的获取屏幕图片方法:

A.GDI方式

在Windows10以前的版本使用GDl(Graphics DeviceInterface)接口从系统中获取屏幕截图,但这种方式性能比较差,获取操作的耗时经常超过40ms,无法保证25帧的截图速率,也就无法保证同屏视频的流畅性,视觉效果不是太好。

B.DXGI方式

DXGI (Microsoft DirectXGraphics 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等格式数据。

使用最为广泛的音视频编解码开源软件项目是fmpeg,这是一套可以功能强大、可运行于很多软硬件平台的音视频处理软件,支持几乎市面上绝大多数音视频编解码、采集、转码、记录、推拉流等处理,支持IntelQSV、LinuxVAAPl、AndroidMediaCode等硬件编解码处理增强。同时,ffmpeg也可由开发者自行开发代码对接新的编解码协议、实现和硬件编解码增强。

4.音视频传输

音视频传输功能将编码压缩后的音视频码流数据通过网络传输协议推送给流媒体服务器,常用的网络传输协议包括:RTMP、RTP、RTSP、HLS等。

A. RTP/RTCP

RTP/RTCP(Real-time Transport Protocol, RTPControl Protocol)用于在网络中传输音视频数据的IETF RFC标准协议,可工作在TCP或UDP上,可单播也可组播,通常和RTCP一起使用。

B. RTSP

RTSP(Real Time Streaming Protocol)是哥伦比亚大学、 Netscape和RealNetworks公司提交的IETF RFC标准。RTSP在体系结构上位于RTP/RTCP之上,语法和HTTP1.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(HTTPLiveStreaming)是苹果公司基于HTTP的流媒体传输协议,主要应用于iOS设备提供音视频直播和点播服务。

结合前述的介绍,同屏推流端在Linux操作系统的软件架构如下图所示:

02.png

03.png


图文来源:四川湖山电器股份有限公司

版权声明:凡注明来源的文章,版权均属原网站作者所有,转载需注明出处。非本站出处的文章为转载,观点仅供业内参考,学习交流。如涉及侵权,请及时联系我们,谢谢!


×

扫码登录网站