流媒體開發中,流媒體系統的實現從數據采集、編碼封裝、傳輸分發、接收解碼播放都有哪些技術和實現,流媒體和本地音視頻又有哪些差異?
影像系統開發,流媒體方向和普通的多媒體影像系統開發有一定差異。
相同點在于圖像多媒體處理以及編程系統等通用方面;本文重點梳理出差異的部分,差異主要在于影像系統在流媒體需要掌握流媒體協議rtsp以及流媒體框架GStreamer,在鏈路流程上增加了傳輸分發部分,在軟件系統設計上注重負載均以及高并發低延遲。
流媒體技術通過實時傳輸音視頻數據應用廣泛,主要涉及直播/短視頻平臺、視頻會議、智能安防等幾大類。最近幾年的觀察,具體來說在直播攝像頭、會議攝像頭、智能家具攝像頭都有很多產品推出。
一、流媒體綜述
流媒體開發除了編程及嵌入式技術外還需要掌握影像技術。嵌入式系統開發技術涵蓋了硬件設計、軟件編程、系統調試等多個方面。
在整理流媒體的數據鏈路上,把流媒體技術根據是否通用分為兩大類,流媒體的特點主要在于網絡傳輸,所以如果你要面試流媒體相關崗位除了影像的通用知識,最好溫習一些網絡協議、流媒體協議和框架的知識。
1.1音視頻通用
(1)采集
流媒體的采集模塊負責從攝像頭、麥克風等輸入設備采集原始的音視頻數據。
流媒體和多媒體的音視頻采集和處理的基礎邏輯是相通的,比如圖像的3A、降噪增強以及音頻的回聲消除AEC、噪聲抑制NS、自動增益控制AGC。
流媒體在采集模塊會重點考慮支持不同分辨率幀率的多攝像頭設備適配。
(2)編碼
流媒體編碼模塊將采集到的原始音視頻數據進行編碼處理,壓縮成適合網絡傳輸的數據流。
音視頻編碼是將原始的音視頻數據壓縮為較小的數據流,以便于傳輸和存儲。這一技術對于減少帶寬占用、提高傳輸效率很重要。
常用的音視頻編碼標準包括H.264、H.265HEVC等視頻編碼標準和AAC、MP3等音頻編碼標準。同時會借用平臺的能力來降低CPU負載,如NVIDIA NVENC、MediaTek APU等等。
(3)封裝
封裝模塊將編碼后的音視頻數據按照特定的格式進行封裝,如FLV、MP4等容器格式,可以用來本地存儲播放,也可以用于網絡傳輸和播放。
(4)解碼
解碼播放模塊在接收端,流媒體接收就用用戶端,不同于本地芯片內完成編碼解碼,流媒體的編碼解碼在不同設備完成。接收端析接收到的音視頻數據,進行解碼處理,并將解碼后的音視頻數據傳遞給播放器進行播放。
1.2流媒體關鍵技術
(1)傳輸
流媒體傳輸模塊利用流媒體傳輸協議將封裝好的音視頻數據發送到服務器或接收端。處理網絡傳輸中的各種問題,如丟包延遲等。
流媒體傳輸協議負責將編碼后的音視頻數據從發送端傳輸到接收端,同時兼顧了實時數據流的傳輸控制、錯誤恢復和同步等功能。
常見的流媒體傳輸協議包括RTSP實時流協議、RTP實時傳輸協議、HTTP Live Streaming等等,傳輸協議的基礎則是網絡通信技術包括TCP/IP、Wi-Fi、藍牙等。
(2)轉發
流媒體服務端使用支持RTMP/HLS/WebRTC協議的流媒體服務器SRS或者Nginx-RTMP,通過分布式框架利用CDN智能調用,兼顧負載均衡Nginx/HAProxy,實現高并發低時延。
(3)接收
流媒體客戶端接收到媒體數據后,軟件使用Android MediaCodec的API實現解碼,以及利用PTS/DTS時間戳實現音視頻同步。
(4)多媒體框架
多媒體框架是嵌入式系統中實現音視頻播放和錄制的軟件架構,比如GStreamer架構提供了豐富的音視頻處理功能,包括解碼、編碼、轉碼、流媒體處理等。
而我們常說的推流則只是框架中的一環,可以使用GStreamer實現,也可以通過專用推流框架OBS Studio/WebRTC實現更加快速。
二、流媒體框架GStreamer
在不同的應用場景下,音視頻嵌入式系統所使用的新媒體播放和流媒體框架會有所不同。
流媒體框架主要用于實時傳輸和處理音視頻數據,比如視頻監控、網絡直播等領域。
GStreamer 是一個開源的多媒體框架,基于管道設計,采用C語言開發,支持跨平臺,提供了處理流媒體的管道架構和音視頻處理能力。它的特點是利用插件架構,可以方便地擴展功能,包括編碼方式、封裝格式等。
GStreamer的管道架構是通過鏈接多個elements構成pipeline來處理多媒體內容,用于音頻錄制、轉碼、播放以及視頻流傳輸等多種場景。
針對顯示和渲染,GStreamer也是通過其插件系統來實現的。比如有專門的視頻 sink 插件xvimagesink
進行視頻渲染,負責將視頻幀輸出到屏幕上。
GStreamer插件機制可以實現非常多的格式支持和處理能力,不僅用于流媒體服務器、多媒體播放器等,在整個圖像軟件的處理過程中都廣泛的使用。
2.1框架代碼
(1)配置環境,從官網站下載GStreamer的Android開發包,并按照官方文檔進行配置,一般都是集成好的。
(2)集成,在項目的build.gradle
文件中添加相應的依賴,或者更多將GStreamer的庫直接集成到項目中。
(3)編寫處理代碼,使用GStreamer提供的API和插件來實現具體的音視頻處理功能。
使用gst_parse_launch()
函數來創建和配置GStreamer的pipeline,通過添加不同的elements(如source、sink、filter等)來實現音視頻數據的捕獲、處理、傳輸等功能,軟件使用它的核心就是掌握這些elements,這和我們掌握ISP的pipeline同理。
(4)編譯和運行,將編寫的代碼保存并編譯,并連接了硬件設備麥克風和攝像頭。使用調試工具測試音視頻處理功能是否正常工作。
2.2框架的使用
(1)音視頻錄制,在插件體系中,配置不同的音頻源和音頻格式,配置不同的視頻格式,滿足不同的錄制需求。
(2)視頻流傳輸,GStreamer RTSP服務器是一種基于GStreamer框架的實時流傳輸協議RTSP的服務器,可用于在Android平臺上進行音視頻流的傳輸和處理。
(3)音視頻轉碼,利用插件實現音視頻數據的轉碼功能,根據需要將音視頻數據轉換為不同的格式或編碼,以滿足不同的播放或存儲需求。
(4)視頻播放,支持MP4、AVI等多種視頻格式的解碼和播放,集成到安卓應用中,實現視頻文件的本地播放或網絡流媒體播放。
(5)音視頻剪輯與編輯,底層可以通過GStreamer的插件和API,還可以實現音視頻數據的剪輯、合并、添加濾鏡等編輯功能。
三、流媒體協議RTSP
在嵌入式系統中,常使用實時流協議RTSP和RTMP實時消息傳輸協議協議來實現流媒體傳輸。這些協議允許客戶端從服務器接收音視頻流,并實時播放。
RTSP(Real Time Streaming Protocol)其實是TCP/IP協議體系中的一個應用層協議,不同于我們學習時考究的傳輸層,該協議主要用于控制聲音或影像的多媒體串流,允許同時多個串流需求控制,從而支持實時流媒體應用。
3.1RTSP特點
(1)雙向:與HTTP的單向不同,RTSP協議是雙向的。RTSP在交互過程中,客戶機和服務器都可以發出請求。
(2)實時:RTSP設計用于實時流媒體傳輸,具有較低的延遲,滿足實時交互的應用場景。
(3)獨立:在傳輸層上,RTSP獨立于RTP和RTCP又相互配合。RTSP控制媒體流的傳輸,RTP和RTCP則負責實際的數據傳輸和質量控制。
(4)功能:RTSP不僅用于傳輸數據,它還允許客戶端控制媒體流的播放,如播放、暫停、快進、快退等。
3.2RTSP工作流
RTSP的核心工作流總結下來就以下幾點,
(1)OPTIONS:客戶端發送OPTIONS請求,get以了解服務器支持哪些方法;
(2)DESCRIBE:客戶端發送DESCRIBE請求,get媒體資源的描述信息,比如編碼分辨率等,服務器則返回媒體資源的SDP格式的描述信息。
(3)SETUP:客戶端發送SETUP請求,用于建立媒體會話,指定傳輸通道協議UDP并請求分配端口,服務器則指定媒體流的傳輸通道和端口。
(4)PLAY:客戶端發送PLAY請求,以開始媒體流的播放。服務器確認PLAY請求,并啟動媒體流的傳輸。
(5)TEARDOWN:當媒體會話結束時,客戶端發送TEARDOWN請求以終止會話,服務器確認并釋放相關資源。
四、流媒體應用
RTSP廣泛應用于需要實時流媒體傳輸的場景,如視頻監控、視頻會議、直播和點播服務、流媒體服務器、媒體播放器等。
4.1安防監控
安防監控攝像頭可以將實時視頻流傳輸到監控中心或客戶端,實現遠程監控和實時查看。
安防監控框架需要具有高實時性、高穩定性和高可靠性,以確保監控視頻能夠實時、準確地傳輸和存儲。需要支持多種視頻編碼格式和網絡協議,以適應不同的監控需求和網絡環境。
這些系統通常由攝像頭、視頻錄像設備和嵌入式處理器組成,通過與傳感器相結合,實現圖像傳輸、分析和存儲等功能。
除了使用自研專有框架,開源框架GStreamer也可用于安防監控系統,以實現跨平臺的視頻流處理和傳輸。
4.2視頻會議
視頻會議框架需要具有低延遲、高清晰度和良好的同步性能,以確保音視頻數據的實時傳輸和播放。
視頻會議系統需要實現音視頻數據的實時傳輸和同步播放,以確保參會人員能夠清晰地看到和聽到對方的發言。
除了使用自研專有框架,開源框架WebRTC支持網頁瀏覽器進行實時音視頻通信的項目也可以用于視頻會議,提供了完整的流媒體功能。
4.3直播和服務器
直播觀眾可以同步實時觀看,需要保證低時延和高可靠性,內容生成和播放同時進行,自動調整碼率,以確保觀眾能夠實時流暢的觀看直播內容。
直播系統完整流程:主播用OBS推流RTMP協議→ 流媒體服務器SRS接收并轉封裝為HLS → CDN分發 → 觀眾通過播放器Video.js拉流觀看。
直播主播端實現RTMP推流協議將數據從主播端推送到服務器;
流媒體服務器負責接收、處理、分發音視頻數據的服務,把將推流協議RTMP轉換為拉流協議HLS,適配不同的終端和網絡,通過CDN進行內容分發。用戶端通過網絡接收到直播的媒體數據。
視頻流媒體的分發也常用P2P技術,對等網絡P2P(Peer-to-Peer)不依賴中心服務器,通過分散的節點分發從而優化視頻流傳輸,即用戶觀看視頻時,其設備可以同時成為其他用戶的源。
除了專有框架,直播系統中常用的流媒體框架包括RTMP(實時消息傳輸協議)框架、HLS(HTTP Live Streaming)框架等。RTMP框架主要用于實現音視頻數據的實時傳輸和控制,而HLS框架則主要用于實現音視頻數據的分片傳輸和自適應碼率播放。
4.4 點播和播放器
區別于直播,點播是用戶按需觀看預先錄制好的內容,比如電影、短視頻等,數據被預先存儲在了服務器中。
點播框架需要具有高兼容性、高穩定性,需要支持多種音視頻格式和編碼標準,以確保用戶能夠播放各種音視頻內容。
點播系統完整流程:上傳MP4文件 → 服務器轉碼為多碼率HLS → 存儲至云端 → 用戶點播時播放器根據網速自動選擇最佳碼率。
點播系統的核心在于播放段,點播系統允許用戶根據自己的需求選擇、快進、播放內容。在服務器中進行根據不同的網路環境進行轉碼生成不同碼率版本,通過漸進式下載或自適應流傳輸。
RTSP服務器可以從實時視頻源獲取音視頻流,并通過RTSP將其傳輸到客戶端進行播放,同時支持點播服務。
除了專有框架,點播系統中常用的新媒體播放框架包括各種播放器軟件所使用的框架,如VLC、MPlayer等。這些框架通常支持多種音視頻格式和編碼標準,能夠解碼并播放用戶選擇的音視頻內容。
4.5音視頻編輯
在音視頻編輯領域,根據編輯平臺的不同,每家公司形成了自己的框架,比如桌面端Adobe Premiere Pro,提供豐富的編輯工具和特效庫;移動端KineMaster,具有輕便、易用和高效的特點;云端WeVideo,備在線協作、實時預覽和分享等功能。
但底層通常依賴于少數開源多媒體處理框架如GStreamer、FFmpeg等,GStreamer的插件化架構適合靈活擴展,但性能優化不如FFmpeg,在此基礎上每家企業常用的模式都是開源+自研的組合方案實現最終的項目方案。
總結
流媒體系統的開發的典型特點一個是最終低延遲和高并發,另一個就是注重傳輸協議設計以及編解碼優化。
當前擁抱AI的發展,主要發展還是AI實時美顏,AI語音降噪,邊緣計算等。
軟件在流媒體的主要的優化方向,在服務器側主要是降低延遲和高并發,比如減少協議棧層級,容器化部署等;在客戶端主要是內存優化,降低功耗。
總結來說,關注流媒體的差異,通信協議和流媒體框架,同時還是要多回歸到影像上。流媒體的應用,比如監控已經發展很完備了,從zf監控到如今的家用監控;直播攝像頭發展還是蠻快的,實際看過好幾家的產品都在迭代中。
相關鏈接:
Android音視頻多媒體開源庫基礎大全
https://mp.weixin.qq.com/s/mM5iYNbTPs4IganY-w_ilw
Android音視頻多媒體開源框架基礎大全
https://mp.weixin.qq.com/s/Hb_IcdTYd10QZaOSf7RTIQ
看到這里還不幫忙點個贊和關注,十分感謝!VX :森哥談成像技術,更新更及時哦。