淺談多平臺音視頻同屏開(kāi)發(fā)技術(shù)
來(lái)源:四川湖山電器股份有限公司 編輯:ZZZ 2024-09-24 10:13:03 加入收藏
淺談多平臺音視頻同屏開(kāi)發(fā)技術(shù)
四川湖山電器股份有限公司 陳柯宇
引言
音視頻同屏處理作為一項核心基礎的關(guān)鍵技術(shù)被廣泛應用于無(wú)紙化會(huì )議、課堂教學(xué)系統等多媒體融合應用場(chǎng)景中。音視頻同屏技術(shù)本身也集中了音視頻采集、編解碼和網(wǎng)絡(luò )傳輸等多領(lǐng)域的技術(shù),內容豐富多樣。隨著(zhù)應用范圍的不斷增加,特別是國產(chǎn)化主機和操作系統平臺的應用普及不斷推進(jìn),音視頻同屏處理技術(shù)需要適配應用于各種異構平臺上,這一訴求更加豐富了音視頻同屏技術(shù)的涵蓋范圍。
本文結合本公司產(chǎn)品實(shí)踐,結合較為當前企業(yè)級應用較為主流Windows和Linux操作系統平臺,提出了適用于指定平臺的端到端音視頻同屏技術(shù)方案。
系統架構設計

系統架構由以下幾個(gè)主要節點(diǎn)組成:
1. 同屏推送端
采集本地設備的音視頻數據,對音視頻數據進(jìn)行編碼壓縮,將編碼壓縮后的音視頻數據流推送到流媒體服務(wù)器。
2. 流媒體服務(wù)器
對來(lái)自同屏推送端的音視頻數據流進(jìn)行轉發(fā),目前已經(jīng)有一些成熟、開(kāi)源的流媒體服務(wù)器軟件項目可用,例如:ZLMediaKit、RTMP Nginx等。
ZLMediaKit是應用廣泛的流媒體服務(wù)器,支持RTSP、RTMP、HTTP、HLS、MPEG-TS等多種協(xié)議,可以實(shí)現音視頻的推流、轉碼、錄制、播放等功能。具有高性能、低延遲、易擴展等特點(diǎn),適用于直播、視頻會(huì )議、監控等場(chǎng)景。ZLMediaKit可以運行在Linux、Windows等操作系統上,支持多種硬件平臺。
3. 播放端
從流媒體服務(wù)器拉取音視頻數據流,對音視頻數據進(jìn)行解碼,將解碼后的音視頻數據播放渲染以呈現給最終用戶(hù)。
因為流媒體服務(wù)器已有較多現成軟件項目可用,所以本文主要說(shuō)明同屏推送端和播放端的開(kāi)發(fā)實(shí)現技術(shù),對于流媒體服務(wù)器不再贅述。
實(shí)現流程
一、同屏推流端
同屏推流端完成的功能包括:
1. 屏幕截圖
屏幕截圖功能包括對鼠標、光標位置和形狀的捕獲。
(1)Linux系統的獲取屏幕圖片方法:
A. framebuffer方式
訪(fǎng)問(wèn)由顯卡顯存映射(mmap)的內存幀緩沖區,使用特殊的設備節點(diǎn):/dev/fb*。framebuffer是一種比較老的渲染方式,因為只能實(shí)現簡(jiǎn)單的整張位圖輸入輸出,需要耗費較多的CPU處理,目前僅仍然在一些輸出簡(jiǎn)單顯示界面或者對顯示性能要求不高的嵌入式設備上使用?,F代Linux系統在X Window System加載后便將其接管,相應地,這種獲取屏幕圖片方式也就失效。
B. OpenGL方式
一種跨平臺的圖形編程接口,在Linux系統中最終仍然是通過(guò)X Window System的協(xié)議庫Xlib實(shí)現各種圖形操作。
C. XCB方式
X Window System由MIT在1984年發(fā)布的一種窗口系統,廣泛使用于類(lèi)UNIX操作系統上。X包括X server和X client,它們之間通過(guò)X協(xié)議通信。X server接收X client的顯示請求,調用底層的顯示設備驅動(dòng)程序,輸出到顯示設備上;同時(shí),把輸入設備的輸入事件,傳遞給相應的X client。X協(xié)議是網(wǎng)絡(luò )透明的,server和client可以位于同一機器上、同一操作系統中,也可以位于不同機器、不同操作系統中(因此X是跨平臺的)。這為遠端GUI登錄提供了便利。X client的實(shí)現上將X協(xié)議封裝為命令原語(yǔ),以庫的形式(xlib或者xcb)向外部應用提供接口。外部應用作為X client調用這些API,向X server發(fā)起請求。X server的實(shí)現幾經(jīng)演變?yōu)楝F在的Xorg。目前的主流版本是X11R6(R7)。
這也是目前在Linux系統常用的獲取屏幕截圖方式。
(2) Windows系統的獲取屏幕圖片方法:
A. GDI方式
在Windows10以前的版本使用GDI (Graphics Device Interface)接口從系統中獲取屏幕截圖,但這種方式性能比較差,獲取操作的耗時(shí)經(jīng)常超過(guò)40ms,無(wú)法保證25幀的截圖速率,也就無(wú)法保證同屏視頻的流暢性,視覺(jué)效果不是太好。
B. DXGI方式
DXGI (Microsoft DirectX Graphics Infrastructure ) 是隨 Windows Vista 引入的新子系統,從Windows10開(kāi)始可以通過(guò)DXGI接口從系統中獲取屏幕截圖,耗時(shí)大幅縮短,能夠保證25幀的截圖速率,大幅提升了同屏視頻的視覺(jué)效果。
2. 聲音采集
聲音采集功能用于獲取本機上其他應用產(chǎn)生的聲音。
(1)Linux系統的采集聲音方法:
A. OSS聲卡系統
OSS(Open Sound System)是一個(gè)類(lèi)Unix和POSIX兼容系統上一個(gè)可選的聲音架構,提供了源代碼級的可移植性。OSSv3是Linux下原始的聲音系統并集成在內核里,但是OSSv4在2002年OSS成為商業(yè)軟件時(shí)它的地位被ALSA所取代。OSSv4在2007年又成為開(kāi)源軟件,4Front Technologies以GPL協(xié)議發(fā)布了它的源碼。OSS的設備節點(diǎn)在/dev目錄下,類(lèi)型為字符設備,其主設備號為14:/dev/dsp: Digital audio。
B. ALS聲卡系統
ALSA提供了Playback和Capture兩種方式對聲卡進(jìn)行操作,應用程序通過(guò)asound庫調用ALSA對聲卡進(jìn)行操作,但在默認情況下Capture方式只能對聲卡的輸入通道進(jìn)行采集,不能進(jìn)行內錄。
通過(guò)配置ALSA環(huán)回(Loopback虛擬聲卡)路由,將真實(shí)的物理聲卡和Loopback輸入通道合并為一個(gè)邏輯聲卡設備,實(shí)現對Loopback輸出通道進(jìn)行采集。
(2)Windows系統的采集聲音方法:
使用MMDevice API來(lái)枚舉和獲取指定設備,用WASAPI來(lái)處理應用程序和音頻設備之間的音頻流數據。
3. 音視頻編碼
音視頻編碼功能將屏幕截圖的bmp數據編碼壓縮成H264/H265數據,將聲音采集的pcm數據編碼壓縮成G711/aac/mp3等格式數據。
使用最為廣泛的音視頻編解碼開(kāi)源軟件項目是ffmpeg, 這是一套可以功能強大、可運行于很多軟硬件平臺的音視頻處理軟件,支持幾乎市面上絕大多數音視頻編解碼、采集、轉碼、記錄、推拉流等處理,支持Intel QSV、Linux VAAPI、Android MediaCode等硬件編解碼處理增強。同時(shí),ffmpeg也可由開(kāi)發(fā)者自行開(kāi)發(fā)代碼對接新的編解碼協(xié)議、實(shí)現和硬件編解碼增強。
4. 音視頻傳輸
音視頻傳輸功能將編碼壓縮后的音視頻碼流數據通過(guò)網(wǎng)絡(luò )傳輸協(xié)議推送給流媒體服務(wù)器,常用的網(wǎng)絡(luò )傳輸協(xié)議包括:RTMP、RTP、RTSP、HLS等。
A. RTP/RTCP
RTP/RTCP(Real-time Transport Protocol, RTP Control Protocol)用于在網(wǎng)絡(luò )中傳輸音視頻數據的IETF RFC標準協(xié)議,可工作在TCP或UDP上,可單播也可組播,通常和RTCP一起使用。
B. RTSP
RTSP(Real Time Streaming Protocol)是哥倫比亞大學(xué)、Netscape和RealNetworks公司提交的IETF RFC標準。RTSP在體系結構上位于RTP/RTCP之上,語(yǔ)法和HTTP 1.1類(lèi)似,默認使用端口號554或8554。RTSP控制消息協(xié)商完成后可使用RTP/RTCP傳輸流媒體數據。
常用的RTSP客戶(hù)端和流媒體轉發(fā)服務(wù)器有:live555、ZLMediaKit。
C. RTMP
RTMP(Real Time MessagingProtocol)是Adobe公司為Flash播放器和服務(wù)器之間音視頻數據傳輸開(kāi)發(fā)的開(kāi)放協(xié)議。工作在TCP之上,默認使用端口號1935,并衍生出:RTMPE、RTMPT、RTMPS??蓪?shí)現主動(dòng)推送,常用的RTMP流媒體轉發(fā)服務(wù)器有:Nginx(rtmp-module)、SRS、ZLMediaKit。
D. HLS
HLS(HTTP Live Streaming)是蘋(píng)果公司基于 HTTP 的流媒體傳輸協(xié)議,主要應用于 iOS 設備提供音視頻直播和點(diǎn)播服務(wù)。
結合前述的介紹,同屏推流端在Linux操作系統的軟件架構如下圖所示:

同屏推流端在Windows操作系統的軟件架構如下圖所示:

上圖中左右邊分別表示視頻和音頻數據在同屏推流端中的數據流。
二、 播放端
播放端的實(shí)現方案相對比較簡(jiǎn)單,完成的功能包括:
1. 音視頻傳輸
音視頻傳輸功能通過(guò)網(wǎng)絡(luò )傳輸協(xié)議從流媒體服務(wù)器拉取編碼壓縮的音視頻碼流數據,常用的網(wǎng)絡(luò )傳輸協(xié)議包括:RTMP、RTP、RTSP、HLS等,和同屏推流端使用的協(xié)議一致。
2. 音視頻解碼
音視頻解碼功能將編碼壓縮的H264/H265、G711/aac/mp3碼流數據解碼還原成YUV或BMP數據。常用的軟件開(kāi)源項目除了前述的ffmpeg,還有libyuv等。
3. 音視頻渲染
音視頻渲染功能渲染呈現解碼后的視頻圖像,播放解碼后的音頻。
(1) 常用的視頻圖像渲染方式:
A. OpenGL
OpenGL是一種跨平臺的圖形編程接口,能夠充分利用GPU的強大處理能力,實(shí)現圖像和圖形的各種渲染顯示。相比較簡(jiǎn)單地由軟件繪圖方式呈現每一幀解碼后的BMP或YUV數據,使用OpenGL能降低CPU占用率,提升整體性能和呈現效果。
B. SDL
SDL(Simple DirectMedia Layer)是一套開(kāi)放源代碼的跨平臺多媒體開(kāi)發(fā)庫,提供了跨平臺的圖像、聲音控制功能,SDL的底層也能通過(guò)OpenGL實(shí)現圖像渲染顯示的功能。
(2) 常用的音頻播放方式:
A. SDL
B. 直接調用系統原生的聲音播放API
因為這種方式需要分別調用不同操作系統的聲卡處理API,且需要配置很多參數,所以不推薦使用這種方式。
總結
本文完整地闡述和說(shuō)明了Windows和Linux平臺下的音視頻同屏技術(shù)解決方案,尤其是針對不同平臺的幾種常見(jiàn)主流處理技術(shù)進(jìn)行了討論和比較。音視頻技術(shù)的發(fā)展非常迅速,新的編解碼技術(shù)標準、傳輸協(xié)議和操作系統底層軟件驅動(dòng)框架也在不斷發(fā)展演變,我們也會(huì )持續跟進(jìn)。
評論comment