從事音視頻開發工作,需要了解哪些常見的開源庫,從應用到底軟系統,整理了九大類,這里一次幫你總結完。
包含了應用層的MediaRecorder、surfaceView,以及常見音視頻處理庫FFmpeg和OpenCV,還有視頻渲染和音頻加速和混音庫,以及關系數據庫。
(1)分類應用
因為處理階段不同,可以分為圖像采集、圖像處理、圖形編解碼、圖像文件、圖像渲染、圖像播放;
根據處理的文件類型不同,分為音頻、視頻、流媒體;
根據使用開源庫的編碼層級,可以分為在驅動層和應用層部署。
(2)什么是開源庫?
?開源庫?是一組函數、方法或工具的集合,旨在封裝特定的功能。
開源庫的應用流程:開發者根據需要選擇型使用庫中的函數和功能,并集成到自己的開發程序中。
音視頻開源庫,提供了豐富的接口調用,且多數都可適配在不同的平臺,專注于提供特定的功能,方便進行集成和擴展,提高多媒體工程師開發的效率,降低了方案設計的門檻。
(3)如何使用這些開源庫?
無論是多媒體的算法工程師,還是系統以及應用工程師,都會使用到不同的開源庫。
多媒體工程師常用的開源庫包含了安卓的類庫和組件庫、以及媒體庫和庫集合等。
安卓類庫一般被應用工程師引用,覆蓋采集,編解碼和播放的流程;
顯示開發工程師通過安卓組件庫實現預覽顯示;
算法工程師進行音視頻處理和編解碼使用媒體庫和庫集合;
底軟工程師做嵌入式系統支撐以及嵌入式數據庫等;
系統軟件工程師把其他所有調用串聯起來按照方案設計達成最終的功能。
1. 安卓多媒體類庫
簡單的音視頻錄制和編解碼以及播放需求,可以選擇MediaRecorder、MediaCodec或MediaPlayer。
框架名稱 | 特點 | 應用場景 |
---|---|---|
MediaRecorder | 多種格式音視頻錄制;可設置視頻源和輸出格式等參數 | 簡單快速集成音視頻錄制應用; |
MediaCodec | 音視頻編解碼;靈活配置編解碼參數 | 視頻編輯和轉碼;視頻通話、視頻會議等實時音視頻通信;視頻壓縮、格式轉換等媒體文件處理。 |
MediaPlayer | 多種播放控制接口;且支持網絡流媒體播放; | 集成如本地視頻文件播放和在線視頻播放等頻播放功能的應用; |
音視頻采集
視頻采集用Camera API類。
audioRecord應用管理音頻資源錄制聲音,把麥克風錄入的音頻數據中得到原始的一幀幀PCM音頻數據。
MediaRecorder?:Android提供的音視頻錄制類,通過API實現控制錄制流程?。
編解碼
使用MediaCodec 類進行編碼壓縮,視頻壓縮為H.264,音頻壓縮為aac,使用MediaMuxer 將音視頻合成為MP4。
MediaCodec是一個Codec,通過硬件加速解碼和編碼。它為芯片廠商和應用開發者搭建了一個統一接口。
MediaCodec類用于使用一些基本的多媒體編解碼器,它是Android基本的多媒體支持基礎架構的一部分,通常和 MediaExtractor
, MediaSync
, MediaMuxer
, MediaCrypto
, MediaDrm
, Image
, Surface
, AudioTrack
一起使用。
?
MediaCodec的數據流分為input流(輸入待解碼或者待編碼的數據)和output流(輸出的已解碼或者已編碼的數據),并通過異步的方式處理兩路數據流,直到手動釋放output緩沖區,MediaCodec才將數據處理完畢
MediaCodec可以處理具體的視頻流,主要有這幾個方法:
- getInputBuffers:獲取需要編碼數據的輸入流隊列,返回的是一個ByteBuffer數組
- queueInputBuffer:輸入流入隊列
- dequeueInputBuffer:從輸入流隊列中取數據進行編碼操作
- getOutputBuffers:獲取編解碼之后的數據輸出流隊列,返回的是一個ByteBuffer數組
- dequeueOutputBuffer:從輸出隊列中取出編碼操作之后的數據
- releaseOutputBuffer:處理完成,釋放ByteBuffer數據
播放
應用開發者使用Java API完成播放調用MediaPlayer和AudioTrack。
MediaPlayer類是Android SDK中的音頻/視頻播放類,提供接口進行媒體控制?,可以播放MP3、AAC等多種格式的聲音文件。
AudioTrack類可以完成Android平臺上音頻數據的輸出任務,AudioTrack只能播放已經解碼的PCM 流(wav格式的音頻文件)。
2.安卓預覽組件類庫
多媒體顯示通過安卓組件類ImageView和surfaceView繪制圖像。
SurfaceView和ImageView都是Android框架中的類,都屬于Android UI組件的一部分,用于被動更新的視頻渲染,可以在Surface上繪制內容。
SurfaceView:
特點:獨立繪制線程、雙緩沖機制、性能渲染。
SurfaceView是一個特殊的視圖組件,用于在獨立的線程中繪制復雜的圖形或視頻內容。
SurfaceView允許在非UI線程中進行繪制,適合處理復雜的圖形渲染,比如游戲、視頻播放、相機預覽等需要高性能渲染的場景。
SurfaceView使用雙緩沖技術,可以減少繪制時的閃爍問題。
ImageView:
特點:顯示靜態圖像、支持縮放和裁剪、單易用。
ImageView則是一個用于顯示圖像的視圖組件,支持從資源文件、網絡或本地文件加載靜態圖片,也可以通過屬性設置控制圖片的縮放。
3.音視頻處理FFmpeg
FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源多媒體處理庫集合,包含了音頻和視頻處理庫、編碼器、解碼器、轉碼器等多種工具。
FFmpeg命令格式
ffmpeg -i [輸入文件名/地址] [參數選項] -f [格式] [輸出文件/地址]
-i
:指定輸入文件或流。[參數選項]
:定義轉換參數,如編解碼器、比特率、尺寸等。-f
:指定輸出格式。[輸出文件/地址]
:指定輸出文件或推送地址。
FFmpeg的庫集合構成
libavformat:用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;
AVIOContext的定義的結構體源碼(位于libavformat/avio.h):
libavcodec:用于各種類型聲音/圖像編解碼;使用 hwaccel(硬件加速)API 來發現并利用可用的硬件編解碼器。
AVCodec的定義的結構體源碼(位于libavcodec/avcodec.h):
libavutil:包含一些公共的工具函數;
libswscale:用于視頻場景比例縮放、色彩映射轉換;
libpostproc:用于后期效果處理;
ffmpeg:該項目提供的一個工具,可用于格式轉換、解碼或電視卡即時編碼等;
ffsever:一個 HTTP 多媒體即時廣播串流服務器;
ffplay:是一個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;
ffprobe:是ffmpeg命令行工具中用來查看媒體文件格式的工具。
ffprobe shy.mp4
ffplay:以FFmpeg框架為基礎,外加渲染音視頻的庫libSDL構建的媒體文件播放器。
ffplay pm.mp4
4.視頻處理OpenCV
OpenCV在Android音視頻開發中提供了豐富的計算機視覺和圖像處理功能。
計算機視覺庫,提供圖像處理、特征提取等函數,源碼開放且支持多平臺部署。
常用于:音視頻處理、圖像處理以及及其學習等。
(1)音視頻處理包括視頻分析、播放和編輯,以及音視頻同步處理、音頻特征提取等功能。
例如:通過對視頻幀的分析,可以實現運動檢測、目標跟蹤、人臉識別等高級功能;使用OpenCV的VideoCapture
類可以加載和播放視頻文件,同時可以對視頻幀進行實時處理,如顏色轉換、縮放等。
(2)圖像處理包括圖像濾波、邊緣檢測、圖像分割以及圖像轉換等。
(3)自OpenCV 3.3版本開始,加入了對深度神經網絡(DNN)的支持,使得在Android平臺上實現基于深度學習的圖像處理和識別成為可能。
5.編解碼x264x265
libx264和openh264都是基于H.264編碼標準的開源實現,提供了高效的H.264編碼能力,適用于本地音視頻播放中的編碼需求。
libx264采用C語言實現,支持跨平臺;openh264由思科開源的H.264編碼庫也支持跨平臺,專注實時視頻編碼,以輕量級庫形式提供。
x265是新一代視頻編碼器HEVC/H.265的開源實現,提供高效的HEVC編碼能力,適用于高分辨率視頻的處理和傳輸。
6.視頻渲染OpenGL ES
OpenGL ES(Open Graphics Library for Embedded Systems)是跨平臺的圖形渲染API規范,在Android Libraries層就有支持使用,提供底層圖形操作接口?。
OpenGL ES API來支持高性能的2D和3D圖形,是跨平臺的圖像API,使用OpenGL渲染視頻畫面。
GLSurfaceView
在Android框架里的類GLSurfaceView 和GLSurfaceView.Renderer可以使用OpenGL ES API創建和操作圖形 。
GLSurfaceView 是個視圖類,使用OpenGL API來繪制和操作圖形對象。通過創建一個SurfaceView的實例并添加渲染器來使用這個類。
捕捉觸摸屏的事件,則擴展GLSurfaceView以實現觸摸監聽器。
GLSurfaceView.Renderer定義了在GLSurfaceView中繪制圖形所需的方法。
GPUimage
GPUimage是基于OpenGL的圖像處理庫,封裝濾鏡和渲染管線,適用于移動端和嵌入式場景。
GPUimage框架核心是充分利用GPU的能力,通過OpenGL ES進行美顏、模糊處理、水印、濾鏡庫等圖像處理。
7.音頻加速OpenSL ES
OpenSL ES (Open Sound Library for Embedded Systems)是無授權費、跨平臺、針對嵌入式系統優化的硬件音頻加速API。
庫的位置在Android NDK的platforms文件夾。
OpenSL ES 是基于NDK也就是c語言的底層開發音頻的公開API,基于對象和接口的方式實現,通過使用它能夠做到標準化, 高性能,低響應時間的音頻功能實現方法。
OpenSL ES 的開發流程:創建接口對象、設置混音器、創建播放器(錄音器)、設置緩沖隊列和回調函數、設置播放狀態、啟動回調函數。
8.音頻混音OpenAL
OpenAL(Open Audio Library)是一個跨平臺的音頻API,以庫形式處理3D音頻和多聲道音頻的播放和混音。OpenAL的API風格模仿自OpenGL。
OpenAL的主要特點包括跨平臺兼容性、高性能和低延遲。它支持多種音頻格式,如PCM、WAV、MP3等,并提供了混音、回放、錄制等功能。
9.關系數據庫SQLite
SQLite是一個開源的輕量級嵌入式關系數據庫,以獨立庫形式集成,無需額外服務支持。沒有獨立進程,和應用程序共生共存。
數據庫的應用
在多媒體開發中,因為多媒體都是以文件的形式存在,所以離不開數據庫的管理。在嵌入式開發中,主要使用SQLite進行播放列表管理和音視頻文件信息存儲。
用戶創建的播放列表、播放歷史以及最近播放記錄等都可以通過SQLite數據庫進行管理。應用可以創建相應的表來存儲這些播放信息,并提供增刪改查等操作。
對于存儲在設備上的音頻文件,SQLite可以用來存儲文件的元數據信息,以便快速檢索和展示這些信息給用戶。
在android開發中的使用方法
首先使用SQLiteDatabase
的openOrCreateDatabase
方法打開或創建數據庫,然后使用execSQL
方法執行SQL語句來創建表,再根據根據需求定義相應的數據模型,之后就可以通過insert
方法插入數據或者使用query方法來執行查詢操作,最后使用close方法關閉數據庫。
// 打開或創建數據庫
SQLiteDatabase db = getApplicationContext().openOrCreateDatabase("mydatabase.db", MODE_PRIVATE, null); // 創建用戶表
db.execSQL("CREATE TABLE IF NOT EXISTS users (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"); // 插入數據
ContentValues values = new ContentValues();
values.put("name", "John Doe");
values.put("age", 30);
db.insert("users", null, values); // 關閉數據庫連接
db.close();
總結
本文根據博主工作經驗,匯總了系統從上到下,作為多媒體開發相關的崗位中,工程師們都會用到的哪些開源庫。
掌握這些,有助于更好的分析問題以及查漏補缺,成為多媒體領域的全棧工程師。
本文只做簡單的梳理,篇幅有限,且一些庫并非博主專長不能做到面面俱到。
如有學習需要可以參考其他詳細資料資料,本系列整理完之后我會把相關的學習資料也匯總分享。
部分庫會結合相關的經驗,再根據實際問題進行詳細補充。
創作不易,本來以為之前做音視頻多媒體技術棧梳理時已經有草稿,真的開始這個系列,確實有些難度,希望對你有所幫助。
最近關注量持續增加,咬牙也要堅持,覺得有用,歡迎點贊支持。