Android音視頻流媒體基礎總結

流媒體開發中,流媒體系統的實現從數據采集、編碼封裝、傳輸分發、接收解碼播放都有哪些技術和實現,流媒體和本地音視頻又有哪些差異?

影像系統開發,流媒體方向和普通的多媒體影像系統開發有一定差異。

相同點在于圖像多媒體處理以及編程系統等通用方面;本文重點梳理出差異的部分,差異主要在于影像系統在流媒體需要掌握流媒體協議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 :森哥談成像技術,更新更及時哦。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83698.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

疫菌QBD案例

本文是《A-VAX: Applying Quality by Design to Vaccines》第七個研究的R語言解決方案。 使用帶兩個中心點的二水平析因設計。運行10次實驗。結果是分辨度為III的設計。 A <- c(25,25,15,15,15,25,25,20,15,20) B <- c(12,8,8,12,8,12,8,10,12,10) C <- c(35,15,15…

Linux部署elasticsearch 單機版

Linux部署elasticsearch 1、下載安裝包 Elasticsearch 7.8.0 | Elastic 2、安裝步驟 2.1、上傳安裝包到服務器opt目錄 2.2、解壓 #目錄創建/opt/module cd /opt mkdir module tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz -C /opt/module mv elasticsearch-7.8.0 …

IDEA高效快捷鍵指南

1. 編輯類快捷鍵 編輯快捷鍵是最常用的一類&#xff0c;可以幫助我們快速操作代碼&#xff1a; 快捷鍵 功能描述 Mac Windows 熱度 psvm Tab 生成 main 方法 psvm Tab psvm Tab ????? sout Tab 生成 System.out.println() 輸出語句 sout Tab sout Tab…

【論文寫作參考文獻地址】

參考文獻地址 論文的各種參考文獻地址國家哲學社會科學文獻中心國家科技圖書文獻中心 論文的各種參考文獻地址 國家哲學社會科學文獻中心 資源免費!!! 整體配色就是紅色&#xff0c;主頁輪播有些實時新聞。 博主個人感受&#xff0c;對于計算機類的收錄不是特別的充足 國家科…

華為OD機考-貨幣單位換算-字符串(JAVA 2025B卷)

純暴力解法 import java.util.*; public class ExchangeMoney {public static void main(String[] args) {Scanner scanner new Scanner(System.in);while(scanner.hasNextLine()){int count Integer.parseInt(scanner.nextLine());List<String> strings new ArrayLi…

系統學習·PHP語言

由于之前沒系統的學習PHP語言&#xff0c;都是在做題時遇到不會的才去查&#xff0c;后來發現這樣的效率非常低&#xff0c;審代碼別人一眼掃出漏洞&#xff0c;而我還需要去查一下這行代碼的意思&#xff0c;那個函數的作用&#xff0c;查當然要查&#xff0c;但連簡單的語法都…

leetcode2-兩數相加

leetcode 2 思路 鏈表特性利用&#xff1a;由于數字按逆序存儲&#xff0c;個位在鏈表頭部&#xff0c;因此可以直接從前往后遍歷鏈表進行逐位相加 比如題目中的 2->4->3 和 5->6->4 其實可以直接按位從第一位開始往后相加&#xff0c;就得到啦708 這樣比把數字…

Java的Arrays.sort():排序算法與優化分析

文章目錄 前言一、基本類型數組&#xff1a;雙軸快速排序關鍵優化策略 二、對象數組&#xff1a;TimSort關鍵優化策略 三、性能對比總結總結 前言 在Java中&#xff0c;Arrays.sort()是開發者最常用的排序方法之一。但你是否思考過它的底層實現&#xff1f;本文將基于OpenJDK …

軟件測試質量的“防”與“治”

引言: 想象一下,你正在建造一座摩天大樓。你是愿意在打地基時就嚴格檢查材料規格和設計圖紙(主動防患),還是等到大樓封頂后才開始拿著錘子敲敲打打找裂縫(被動補救)?軟件世界亦是如此!今天,我們就來聊聊軟件測試這個“質量守護神”的兩大戰略思維和三大實戰招式,讓你…

TDengine 如何從 2.x 遷移到 3.0

本節講述如何通過 Explorer 界面創建數據遷移任務&#xff0c;從舊版 TDengine2 遷移數據到 TDengine 3.0 集群。 功能概述 taosX 通過 SQL 查詢源集群數據&#xff0c;并把查詢結果寫入到目標數據庫。具體實現上&#xff0c;taosX 以一個子表的一個時間段的數據作為查詢的基…

免下載蘋果 IPA 文件重簽名工具:快速更換應用名稱和 BID的教程

在iOS設備的使用和開發過程中&#xff0c;我們有時需要對IPA文件進行重簽名&#xff0c;以便更換應用名稱、Bundle ID&#xff08;軟件包標識符&#xff09;或其他相關信息。這一過程通常需要使用到特定的工具&#xff0c;然而&#xff0c;市面上的一些工具可能需要下載和安裝&…

Python全棧開發:前后端分離項目架構詳解

文章目錄 技術棧選擇后端技術棧前端技術棧 項目整體結構詳細目錄結構說明后端架構&#xff08;backend/&#xff09;1. 應用核心&#xff08;app/&#xff09;2. 數據層&#xff08;models/&#xff09;3. API模式層&#xff08;schemas/&#xff09;4. API路由層&#xff08;a…

微信小程序使用圖片實現紅包雨功能

微信小程序紅包雨功能實現&#xff1a;從組件封裝到頁面調用的完整實踐 先看示例截圖&#xff1a; 一、背景與技術選型 在微信小程序營銷活動中&#xff0c;紅包雨是一種極具吸引力的互動形式。實現紅包雨效果主要有 Canvas 和圖片兩種方案&#xff1a; &#xff08;1&…

Python day31

浙大疏錦行 數據拆分的基本框架&#xff0c;拆分后讓項目結構更加清晰

Chapter10-XXE

文章目錄 1.XXE介紹1.1 XXE產生的原因1.1.1 什么是XML&#xff1f;1.1.2 什么是XML實體1.1.3 什么是文檔類型定義&#xff08;document type definition&#xff09;1.1.4 什么是XML自定義實體1.1.5 什么是XML外部實體 2.XXE攻擊類型2.1 利用XXE檢索文件2.2 利用XXE執行SSRF攻擊…

Ribbon負載均衡實戰指南:7種策略選擇與生產避坑

引言&#xff1a;客戶端負載均衡的不可替代性 當面試官問你&#xff1a;“Ribbon 和 Nginx 有什么區別&#xff1f;”——Ribbon 是進程內 LB 這一句話值 20K 月薪。 作為微服務調用的核心樞紐&#xff0c;Ribbon 通過 ??本地服務清單動態分發請求??&#xff0c;避免中心化…

Webpack:現代前端構建工具的核心解析

Hi&#xff0c;我是布蘭妮甜 &#xff01;在前端工程化日益重要的今天&#xff0c;Webpack作為主流構建工具&#xff0c;已成為現代前端開發的核心基礎設施。它通過模塊化打包機制&#xff0c;優雅地解決了復雜應用中的資源管理問題&#xff0c;使開發者能夠專注于業務邏輯的實…

Elasticsearch索引wildcard查詢

在之前的文章 Elasticsearch索引的字段映射 中介紹過關于索引中字段查詢的多種方式。可以根據需要通過設置索引字段的type以及fields來實現分詞,精確匹配等多種方式的查詢。 elasticSearch中檢索核心類型大概可以分為:精準匹配檢索(Term-level queries)和基于分詞的全文匹…

1.3、SDH光接口類型

接口類型的命名遵循一個特定的代碼結構&#xff0c;格式通常為&#xff1a;應用代碼-速率等級.波長/距離代碼。 代碼的第一位字母表示應用場合&#xff1a;I 表示局內通信&#xff1b;S 表示短距離局間通信&#xff1b;L 表示長距離局間通信。字母橫杠后的第一位表示 STM 的速率…

淺析MySQL數據遷移與恢復:從SQLServer轉型到MySQL

文章目錄 前言一、MySQL與SQLServer數據管理方式對比1.1 文件結構差異&#xff1a;1.2 存儲引擎多樣性&#xff1a;1.3 備份恢復方式&#xff1a; 二、MySQL數據遷移方法與技術2.1 邏輯備份與恢復2.2 物理備份與恢復2.3 異構數據庫遷移(從SQLServer到MySQL) 三、MySQL數據恢復策…