DAV首頁
數字音視工程網

微信公眾號

數字音視工程網

手機DAV

  • 熱門搜索:
  • 技術風向標
  • LED小間距
  • null
    null
    null
    卓華,
    招商,
    null
    null
    null
    快捷,
    null

    我的位置:

    share

    淺談多平臺音視頻同屏開發技術

    來源:四川湖山電器股份有限公司        編輯:ZZZ    2024-09-24 10:13:03     加入收藏    咨詢

    咨詢
    所在單位:*
    姓名:*
    手機:*
    職位:
    郵箱:*
    其他聯系方式:
    咨詢內容:
    驗證碼:
    不能為空 驗證碼錯誤
    確定

    音視頻同屏處理作為一項核心基礎的關鍵技術被廣泛應用于無紙化會議、課堂教學系統等多媒體融合應用場景中。

    淺談多平臺音視頻同屏開發技術

    四川湖(hu)山電器股份有限公司(si) 陳柯宇

     

      引言

      音(yin)視頻(pin)同屏(ping)處(chu)理作為(wei)一項核心基礎的關鍵技術被廣泛應(ying)用(yong)于無紙化(hua)會議、課堂教(jiao)學系統(tong)等多媒(mei)體融合應(ying)用(yong)場景中。音(yin)視頻(pin)同屏(ping)技術本身也集(ji)中了音(yin)視頻(pin)采集(ji)、編解碼和網絡(luo)傳輸等多領域的技術,內容豐富多樣(yang)。隨著(zhu)應(ying)用(yong)范(fan)圍(wei)的不斷增加,特(te)別是(shi)國產化(hua)主機和操作系統(tong)平臺的應(ying)用(yong)普及不斷推進,音(yin)視頻(pin)同屏(ping)處(chu)理技術需要適配(pei)應(ying)用(yong)于各(ge)種異構平臺上,這一訴求更加豐富了音(yin)視頻(pin)同屏(ping)技術的涵蓋范(fan)圍(wei)。

      本(ben)文結(jie)合(he)(he)本(ben)公司(si)產品(pin)實踐,結(jie)合(he)(he)較為當前(qian)企業級應用較為主流Windows和Linux操作(zuo)系統平(ping)臺(tai),提(ti)出了適用于指定平(ping)臺(tai)的端(duan)到端(duan)音視頻同(tong)屏技術方案(an)。

     

      系統架構設計

      系(xi)統架構由(you)以下幾個主要節點組(zu)成(cheng):

      1. 同屏(ping)推(tui)送(song)端

      采集本地設備的音視頻數據,對音視頻數據進行編碼壓縮,將編碼壓縮后的音視頻數據流推送到流媒體服務器

      2. 流媒體服務器

      對(dui)來(lai)自同屏推送(song)端的音(yin)視(shi)頻(pin)數據流進(jin)行(xing)轉發(fa),目前已(yi)經有(you)一(yi)些(xie)成(cheng)熟、開源的流媒(mei)體(ti)服務(wu)器(qi)軟件項目可用,例如:ZLMediaKit、RTMP Nginx等。

      ZLMediaKit是應用廣泛的(de)流媒體服務器,支持RTSP、RTMP、HTTP、HLS、MPEG-TS等(deng)多種協議(yi),可以(yi)實現音視頻的(de)推流、轉(zhuan)碼(ma)、錄制、播放等(deng)功(gong)能(neng)。具有高性能(neng)、低(di)延遲、易擴展等(deng)特點,適(shi)用于直播、視頻會議(yi)、監控等(deng)場景(jing)。ZLMediaKit可以(yi)運行在Linux、Windows等(deng)操(cao)作系(xi)統上,支持多種硬件平臺。

      3. 播(bo)放(fang)端(duan)

      從流(liu)媒體服務(wu)器拉取音(yin)視頻(pin)數據流(liu),對音(yin)視頻(pin)數據進行解碼,將解碼后的(de)音(yin)視頻(pin)數據播放渲染以呈現給最終用戶。

      因為流媒體服(fu)務(wu)器已有(you)較(jiao)多(duo)現成軟件項目可用(yong),所以本文主(zhu)要(yao)說明同屏(ping)推送端(duan)和播放(fang)端(duan)的開發實現技術,對(dui)于流媒體服(fu)務(wu)器不再贅述。

     

      實現流程

      一、同屏推流端(duan)

      同(tong)屏推流端完(wan)成的功能包括(kuo):

      1. 截圖

       屏幕截(jie)圖功能包括對鼠標(biao)、光(guang)標(biao)位(wei)置和形狀的(de)捕獲。

      (1)Linux系統的獲取屏幕圖片方法:

      A. framebuffer方式

      訪問由顯(xian)卡顯(xian)存映射(mmap)的(de)(de)(de)內存幀(zhen)緩(huan)沖區,使用(yong)特殊的(de)(de)(de)設(she)備節點:/dev/fb*。framebuffer是(shi)一種(zhong)比較(jiao)老的(de)(de)(de)渲(xuan)染方(fang)式,因為只(zhi)能(neng)實現(xian)簡(jian)單(dan)的(de)(de)(de)整(zheng)張位圖輸入輸出(chu)(chu),需要(yao)耗費較(jiao)多的(de)(de)(de)CPU處(chu)理,目前僅仍然(ran)在一些輸出(chu)(chu)簡(jian)單(dan)顯(xian)示界面(mian)或者對顯(xian)示性能(neng)要(yao)求不(bu)高的(de)(de)(de)嵌入式設(she)備上使用(yong)。現(xian)代Linux系統在X Window System加載后便將其接管,相(xiang)應地,這種(zhong)獲(huo)取屏幕圖片方(fang)式也(ye)就失(shi)效。

      B. OpenGL方式

      一種(zhong)跨(kua)平臺的圖形編程接(jie)口(kou),在Linux系統中最終(zhong)仍然是通過X Window System的協議庫Xlib實現各種(zhong)圖形操作(zuo)。

      C. XCB方式

      X Window System由MIT在(zai)1984年發布的(de)(de)(de)一(yi)(yi)種窗口(kou)系(xi)統(tong),廣泛(fan)使用于類UNIX操(cao)作(zuo)系(xi)統(tong)上。X包括X server和X client,它們(men)之(zhi)間(jian)通過(guo)X協(xie)議通信。X server接收X client的(de)(de)(de)顯示請求,調(diao)(diao)用底層的(de)(de)(de)顯示設(she)(she)備(bei)驅動程序,輸出到顯示設(she)(she)備(bei)上;同(tong)時,把輸入(ru)設(she)(she)備(bei)的(de)(de)(de)輸入(ru)事件,傳遞給相(xiang)應(ying)(ying)的(de)(de)(de)X client。X協(xie)議是網絡透明的(de)(de)(de),server和client可(ke)以位(wei)于同(tong)一(yi)(yi)機(ji)器上、同(tong)一(yi)(yi)操(cao)作(zuo)系(xi)統(tong)中,也可(ke)以位(wei)于不同(tong)機(ji)器、不同(tong)操(cao)作(zuo)系(xi)統(tong)中(因此(ci)X是跨平臺的(de)(de)(de))。這為遠端GUI登錄提(ti)供了便利。X client的(de)(de)(de)實現(xian)上將X協(xie)議封(feng)裝為命令原語(yu),以庫的(de)(de)(de)形(xing)式(xlib或者xcb)向(xiang)外部(bu)應(ying)(ying)用提(ti)供接口(kou)。外部(bu)應(ying)(ying)用作(zuo)為X client調(diao)(diao)用這些(xie)API,向(xiang)X server發起請求。X server的(de)(de)(de)實現(xian)幾經演變為現(xian)在(zai)的(de)(de)(de)Xorg。目前的(de)(de)(de)主流版本(ben)是X11R6(R7)。

      這也是(shi)目(mu)前在Linux系統(tong)常(chang)用的(de)獲取屏幕(mu)截(jie)圖方(fang)式。

      (2) Windows系統的獲取屏幕圖片方法:

      A. GDI方式

      在Windows10以前的版本使用GDI (Graphics Device Interface)接口(kou)從系統中獲(huo)取屏幕截圖(tu),但這種方(fang)式性能(neng)比較差,獲(huo)取操作的耗時經常(chang)超過40ms,無(wu)法(fa)(fa)保(bao)證25幀(zhen)的截圖(tu)速率,也就(jiu)無(wu)法(fa)(fa)保(bao)證同屏視(shi)頻的流暢(chang)性,視(shi)覺效果不是(shi)太好。

      B. DXGI方式

      DXGI (Microsoft DirectX Graphics Infrastructure ) 是(shi)隨 Windows Vista 引入的(de)新子系(xi)(xi)統,從Windows10開始可(ke)以通過DXGI接口從系(xi)(xi)統中(zhong)獲取屏幕(mu)截(jie)圖,耗時大(da)幅(fu)縮短,能夠保證25幀的(de)截(jie)圖速(su)率,大(da)幅(fu)提升了同(tong)屏視頻的(de)視覺(jue)效果。

      2. 聲音采集

      聲音采集功能用于獲取本機(ji)上其他應(ying)用產生的聲音。

      (1)Linux系統的采集聲音方法:

      A. OSS聲卡系統

      OSS(Open Sound System)是一(yi)個(ge)(ge)類Unix和POSIX兼(jian)容系統(tong)上一(yi)個(ge)(ge)可(ke)選的聲音架構,提(ti)供了(le)源代(dai)碼(ma)級的可(ke)移(yi)植(zhi)性。OSSv3是Linux下(xia)原始的聲音系統(tong)并集(ji)成(cheng)在(zai)內核(he)里,但是OSSv4在(zai)2002年OSS成(cheng)為商業軟件(jian)時它(ta)(ta)的地位被ALSA所取代(dai)。OSSv4在(zai)2007年又(you)成(cheng)為開源軟件(jian),4Front Technologies以GPL協議發布(bu)了(le)它(ta)(ta)的源碼(ma)。OSS的設備節(jie)點在(zai)/dev目錄下(xia),類型(xing)為字符設備,其主(zhu)設備號(hao)為14:/dev/dsp: Digital audio。

      B. ALS聲卡系統

      ALSA提供了Playback和(he)Capture兩種方(fang)式對(dui)聲(sheng)卡進(jin)行(xing)(xing)操作,應(ying)用程序通(tong)過asound庫調用ALSA對(dui)聲(sheng)卡進(jin)行(xing)(xing)操作,但在默認情況下Capture方(fang)式只(zhi)能(neng)對(dui)聲(sheng)卡的輸(shu)入通(tong)道進(jin)行(xing)(xing)采集,不(bu)能(neng)進(jin)行(xing)(xing)內錄。

      通(tong)過配置ALSA環回(hui)(Loopback虛擬聲(sheng)(sheng)卡(ka))路(lu)由,將(jiang)真實(shi)的(de)物理(li)聲(sheng)(sheng)卡(ka)和Loopback輸入通(tong)道合并為一個邏(luo)輯聲(sheng)(sheng)卡(ka)設備,實(shi)現對Loopback輸出通(tong)道進行采集。

      (2)Windows系統的采集聲音方法:

      使用MMDevice API來(lai)枚舉和獲取指定設備(bei),用WASAPI來(lai)處理應用程序(xu)和音(yin)頻(pin)設備(bei)之(zhi)間的(de)音(yin)頻(pin)流數(shu)據。

      3. 音視頻編碼

      音(yin)視頻編(bian)碼(ma)功能將屏幕截圖的bmp數(shu)(shu)據(ju)編(bian)碼(ma)壓縮(suo)成(cheng)H264/H265數(shu)(shu)據(ju),將聲(sheng)音(yin)采集(ji)的pcm數(shu)(shu)據(ju)編(bian)碼(ma)壓縮(suo)成(cheng)G711/aac/mp3等(deng)格式數(shu)(shu)據(ju)。

      使(shi)用最為廣泛(fan)的音視(shi)頻編(bian)解碼開源軟(ruan)件(jian)項目是(shi)ffmpeg, 這是(shi)一套可以功能強(qiang)(qiang)(qiang)大、可運行(xing)于很多(duo)軟(ruan)硬件(jian)平臺的音視(shi)頻處理(li)軟(ruan)件(jian),支持(chi)幾乎市面(mian)上絕(jue)大多(duo)數音視(shi)頻編(bian)解碼、采(cai)集、轉碼、記(ji)錄、推(tui)拉流等處理(li),支持(chi)Intel QSV、Linux VAAPI、Android MediaCode等硬件(jian)編(bian)解碼處理(li)增強(qiang)(qiang)(qiang)。同(tong)時(shi),ffmpeg也可由開發者自行(xing)開發代碼對接新的編(bian)解碼協議、實(shi)現和硬件(jian)編(bian)解碼增強(qiang)(qiang)(qiang)。

      4. 音視頻傳輸

      音視頻傳(chuan)輸功能(neng)將編碼壓縮后的(de)音視頻碼流數據(ju)通過網絡傳(chuan)輸協議(yi)推送給(gei)流媒體服(fu)務器,常(chang)用的(de)網絡傳(chuan)輸協議(yi)包括:RTMP、RTP、RTSP、HLS等。

      A. RTP/RTCP

      RTP/RTCP(Real-time Transport Protocol, RTP Control Protocol)用于在網絡中傳輸音(yin)視頻數據的IETF RFC標(biao)準協議,可(ke)(ke)(ke)工作在TCP或UDP上,可(ke)(ke)(ke)單播也可(ke)(ke)(ke)組(zu)播,通常和(he)RTCP一(yi)起使用。

      B. RTSP

      RTSP(Real Time Streaming Protocol)是哥倫比(bi)亞大學、Netscape和(he)RealNetworks公司提(ti)交的(de)IETF RFC標(biao)準。RTSP在體系結構上位于RTP/RTCP之上,語法和(he)HTTP 1.1類似,默認使(shi)用(yong)端口號554或8554。RTSP控制消息(xi)協(xie)商完成(cheng)后可使(shi)用(yong)RTP/RTCP傳(chuan)輸流媒體數據(ju)。

      常用的RTSP客戶端和流媒體轉發服務器有:live555、ZLMediaKit。

      C. RTMP

      RTMP(Real Time MessagingProtocol)是Adobe公司為Flash播(bo)放器和服務(wu)器之(zhi)間音視(shi)頻數據傳輸(shu)開發的開放協議(yi)。工作在TCP之(zhi)上,默認使用(yong)端口號1935,并衍(yan)生出(chu):RTMPE、RTMPT、RTMPS。可實現主動推送,常(chang)用(yong)的RTMP流媒體(ti)轉(zhuan)發服務(wu)器有(you):Nginx(rtmp-module)、SRS、ZLMediaKit。

      D. HLS

      HLS(HTTP Live Streaming)是蘋果公司基于 HTTP 的(de)流媒(mei)體傳輸協(xie)議,主要應用于 iOS 設備提供音視(shi)頻直播和點播服務。

      結合前(qian)述的介(jie)紹,同屏推流端在Linux操作系統的軟件架構如下(xia)圖所示:

      同屏推(tui)流端(duan)在Windows操(cao)作系統的軟(ruan)件架構如下圖所示:

      上圖中(zhong)(zhong)左(zuo)右邊(bian)分別(bie)表示視頻和音頻數據(ju)在同屏推流(liu)端中(zhong)(zhong)的數據(ju)流(liu)。

      二、 播放端

      播放(fang)端(duan)的實(shi)現方案相對比較簡單,完(wan)成(cheng)的功能包括:

      1. 音視頻傳輸

      音(yin)視(shi)頻傳(chuan)輸(shu)功能通過網(wang)絡傳(chuan)輸(shu)協(xie)議從(cong)流媒體服務器拉(la)取編(bian)碼(ma)壓(ya)縮(suo)的音(yin)視(shi)頻碼(ma)流數據,常用的網(wang)絡傳(chuan)輸(shu)協(xie)議包括:RTMP、RTP、RTSP、HLS等,和(he)同屏推流端使用的協(xie)議一致。

      2. 音視頻解碼

      音視頻解(jie)(jie)碼(ma)功能將編碼(ma)壓縮的H264/H265、G711/aac/mp3碼(ma)流數據解(jie)(jie)碼(ma)還(huan)原(yuan)成YUV或BMP數據。常用的軟(ruan)件開源項目(mu)除了前述的ffmpeg,還(huan)有libyuv等。

      3. 音視頻渲染

      音視頻(pin)(pin)渲染功能渲染呈現解碼后的視頻(pin)(pin)圖像(xiang),播放解碼后的音頻(pin)(pin)。

      (1) 常用的視頻圖像渲染方式:

      A. OpenGL

      OpenGL是一種跨平臺的(de)圖(tu)形編程(cheng)接口,能夠充(chong)分利(li)用(yong)GPU的(de)強大(da)處理能力,實(shi)現圖(tu)像和(he)圖(tu)形的(de)各種渲染顯示(shi)。相比較(jiao)簡單地由軟件繪(hui)圖(tu)方式呈(cheng)現每一幀解碼后的(de)BMP或YUV數據(ju),使(shi)用(yong)OpenGL能降低CPU占(zhan)用(yong)率(lv),提升(sheng)整體性能和(he)呈(cheng)現效果。

      B. SDL

      SDL(Simple DirectMedia Layer)是一套開放源代碼的(de)跨(kua)平(ping)臺多(duo)媒(mei)體開發庫,提供了跨(kua)平(ping)臺的(de)圖(tu)像、聲音控制功(gong)能(neng),SDL的(de)底層也能(neng)通(tong)過(guo)OpenGL實現(xian)圖(tu)像渲染顯示的(de)功(gong)能(neng)。

      (2) 常用的音頻播放方式:

      A. SDL

      B. 直接調用系統原生的聲音播放API

       因為(wei)這種(zhong)方式需要分別調(diao)用(yong)不(bu)同(tong)操作系(xi)統的聲卡處理API,且需要配置很多參數,所以不(bu)推薦使用(yong)這種(zhong)方式。

     

      總結

      本(ben)文完(wan)整地闡述和(he)說明了Windows和(he)Linux平臺下的(de)音視頻同屏技(ji)術解(jie)決方案,尤其是針(zhen)對不同平臺的(de)幾種(zhong)常(chang)見主流(liu)處(chu)理技(ji)術進(jin)行了討論和(he)比較。音視頻技(ji)術的(de)發(fa)展(zhan)非常(chang)迅速,新的(de)編解(jie)碼(ma)技(ji)術標準、傳輸(shu)協議和(he)操作(zuo)系(xi)統底層軟件驅(qu)動(dong)框(kuang)架也(ye)在不斷發(fa)展(zhan)演變,我們也(ye)會持續跟進(jin)。

    免責聲明:本文來源于四川湖山電器股份有限公司,本文僅代表作者個人觀點,本站不作任何保證和承諾,若有任何疑問,請與本文作者聯系或有侵權行為聯系本站刪除。(原創稿件未經許可,不可轉載,轉載請注明來源)
    掃一掃關注數字音視工程網公眾號

    相關閱讀related

    評論comment

     
    驗證碼:
    您還能輸入500