Android音視頻多媒體開源庫基礎大全

從事音視頻開發工作,需要了解哪些常見的開源庫,從應用到底軟系統,整理了九大類,這里一次幫你總結完。

包含了應用層的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.安卓預覽組件類庫

多媒體顯示通過安卓組件類ImageViewsurfaceView繪制圖像。

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開發中的使用方法

首先使用SQLiteDatabaseopenOrCreateDatabase方法打開或創建數據庫,然后使用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();

在這里插入圖片描述

總結

本文根據博主工作經驗,匯總了系統從上到下,作為多媒體開發相關的崗位中,工程師們都會用到的哪些開源庫。

掌握這些,有助于更好的分析問題以及查漏補缺,成為多媒體領域的全棧工程師。

本文只做簡單的梳理,篇幅有限,且一些庫并非博主專長不能做到面面俱到。

如有學習需要可以參考其他詳細資料資料,本系列整理完之后我會把相關的學習資料也匯總分享。

部分庫會結合相關的經驗,再根據實際問題進行詳細補充。

創作不易,本來以為之前做音視頻多媒體技術棧梳理時已經有草稿,真的開始這個系列,確實有些難度,希望對你有所幫助。

最近關注量持續增加,咬牙也要堅持,覺得有用,歡迎點贊支持。

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

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

相關文章

若依前端框架增刪改查

1.下拉列表根據數據庫加載 這個是用來查詢框 綁定了 change 事件來處理站點選擇變化后的查詢邏輯。 <el-form-item label"站點選擇" prop"stationId" v-has-permi"[ch:m:y]"><el-select v-model"queryParams.stationId" pl…

Java 第十一章 GUI編程(3)

目錄 內部類 內部類定義 內部類的特點 匿名內部類 格式&#xff1a; 內部類的意義 實例 內部類 ● 把類定義在另一個類的內部&#xff0c;該類就被稱為內部類。 ● 如果在類 Outer 的內部再定義一個類 Inner&#xff0c;此時類 Inner 就稱為內部類 &#xff08;或稱為嵌…

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量回歸預測

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量回歸預測 目錄 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量回歸預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量回歸預…

3DMAX曲線生成器插件CurveGenerator使用方法

1. 腳本功能簡介 3DMAX曲線生成器插件CurveGenerator是一個用于 3ds Max 的樣條線生成工具&#xff0c;用戶可以通過簡單的UI界面輸入參數&#xff0c;快速生成多條樣條線。每條樣條線的高度值隨機生成&#xff0c;且可以自定義以下參數&#xff1a; 頂點數量&#xff1a;每條…

LiteratureReading:[2023] GPT-4: Technical Report

文章目錄 一、文獻簡明&#xff08;zero&#xff09;二、快速預覽&#xff08;first&#xff09;1、標題分析2、作者介紹3、引用數4、摘要分析&#xff08;1&#xff09;翻譯&#xff08;2&#xff09;分析 5、總結分析&#xff08;1&#xff09;翻譯&#xff08;2&#xff09;…

vm_pwn入門 -- [GHCTF 2025]my_vm

先看基本邏輯 int __fastcall main(int argc, const char **argv, const char **envp) {unsigned __int16 IP; // [rspCh] [rbp-14h] BYREFunsigned __int16 SP; // [rspEh] [rbp-12h] BYREFunsigned __int16 cmd_count; // [rsp10h] [rbp-10h] BYREFunsigned __int16 i; // [r…

CA 機構如何防止中間人攻擊

在現代互聯網中&#xff0c;中間人攻擊&#xff08;Man-in-the-Middle Attack&#xff0c;簡稱 MITM&#xff09;是一種常見的網絡攻擊方式&#xff0c;攻擊者通過攔截和篡改通信雙方的信息&#xff0c;進而竊取敏感數據或執行惡意操作。為了防止中間人攻擊&#xff0c;證書頒發…

Elasticsearch快速上手與深度進階:一站式實戰教程

目錄 1. Elasticsearch 簡介 2. 安裝與啟動 方式 1&#xff1a;Docker 快速安裝&#xff08;推薦&#xff09; 方式 2&#xff1a;手動安裝 3. 基礎操作 3.1 創建索引 3.2 插入文檔 3.3 查詢文檔 3.4 更新文檔 3.5 刪除文檔 4. 高級查詢 4.1 布爾查詢 4.2 范圍查詢…

聞所聞盡:穿透聲音的寂靜,照見生命的本真

在《楞嚴經》的梵音繚繞中&#xff0c;"聞所聞盡"四個字如晨鐘暮鼓&#xff0c;叩擊著每個修行者的心門。這個源自觀世音菩薩耳根圓通法門的核心概念&#xff0c;既是佛門修行的次第指引&#xff0c;更蘊含著東方哲學對生命本質的終極叩問。當我們穿越時空的帷幕&…

回溯法經典練習:組合總和的深度解析與實戰

回溯法經典練習&#xff1a;組合總和的深度解析與實戰 引言 在算法世界里&#xff0c;回溯法&#xff08;Backtracking&#xff09;是解決 組合、排列、子集 等問題的神器。而 “組合總和”&#xff08;Combination Sum&#xff09; 問題&#xff0c;更是回溯算法中的經典代表…

傳感器研習社:Swift Navigation與意法半導體(STMicroelectronics)合作 共同推出端到端GNSS汽車自動駕駛解決方案

自動駕駛系統單純依賴感知傳感器進行定位在遇到惡劣天氣或缺乏車道標線的道路場景時很容易失效。此外&#xff0c;由于激光雷達&#xff08;LiDAR&#xff09;、視覺等傳感器的成本高昂以及將眾多不同組件整合為統一系統的復雜性&#xff0c;都可能增加產品研發成本或延遲產品上…

【人工智能】Ollama 的 API 操作指南:打造個性化大模型服務

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著人工智能技術的飛速發展,大型語言模型(LLM)在自然語言處理領域的應用日益廣泛。然而,傳統的云端模型服務往往面臨數據隱私、成本高…

Linux關機重啟二三事

、、 1概述 故障是高可用組最常接觸的場景&#xff0c;其中包含了進程故障&#xff0c;網絡故障、系統故障&#xff0c;硬件故障。掉電、關機和重啟作為其中最常見的系統故障&#xff0c;具體的細節還是有些許差異的。本文將從操作系統與主板的行為講解三者之間的聯系與區別。…

算法1--兩束求和

題目描述 解題思路 先說一種很容易想到的暴力解法 暴力解法的思路很簡單&#xff0c;就是遍歷數組&#xff0c;對于每一個元素&#xff0c;都去遍歷數組中剩下的元素&#xff0c;判斷是否有兩個元素的和等于目標值&#xff0c;如果有&#xff0c;就返回這兩個元素的下標。 c…

在Fedora-Workstation-Live-x86_64-41-1.4中使用最新版本firefox和騰訊翻譯插件讓英文網頁顯示中文翻譯

在Fedora-Workstation-Live-x86_64-41-1.4中使用最新版本firefox和騰訊翻譯插件讓英文網頁顯示中文翻譯 應用——系統工具——終端 suozhangfedora:~$ rpm -aq | grep firefox firefox-131.0.2-1.fc41.x86_64 firefox-langpacks-131.0.2-1.fc41.x86_64 fedora41系統自身安裝有f…

android 接入google 登錄

在 Android 應用中接入 Google 登錄功能,可讓用戶使用他們的 Google 賬號快速登錄應用。以下是詳細的接入步驟和示例代碼: 步驟 1:創建 Google API 項目 訪問 Google API 控制臺,并使用你的 Google 賬號登錄。點擊 “選擇項目”,然后點擊 “新建項目”,按照提示填寫項目…

Redis緩存與數據庫 數據一致性保障

為什么要保證數據一致性 只要使用redis做緩存&#xff0c;就必然存在緩存和DB數據一致性問題。若數據不一致&#xff0c;則業務應用從緩存讀取的數據就不是最新數據&#xff0c;可能導致嚴重錯誤。比如將商品的庫存緩存在Redis&#xff0c;若庫存數量不對&#xff0c;則下單時…

19.哈希表的實現

1.哈希的概念 哈希(hash)?稱散列&#xff0c;是?種組織數據的?式。從譯名來看&#xff0c;有散亂排列的意思。本質就是通過哈希函數把關鍵字Key跟存儲位置建??個映射關系&#xff0c;查找時通過這個哈希函數計算出Key存儲的位置&#xff0c;進?快速查找。 1.2.直接定址法…

IoTDB TTL不生效

問題 時序數據庫 IoTDB 1.3.0 版本數據庫的 TTL 設置為兩天&#xff0c;show databases details 看到設置也是正確的&#xff0c;怎么還是可以查到好幾天前的數據&#xff1f;因為有很多不活躍的測點&#xff0c;所以專門設置了兩天過期&#xff0c;有什么辦法可以自動清理呢&…

【C++基礎】Lambda 函數 基礎知識講解學習及難點解析

一、引入 在 C 中&#xff0c;我們通常使用函數來完成特定的功能。但有時候&#xff0c;我們需要在一個函數內部定義一個小型的功能塊&#xff0c;這時如果單獨寫一個函數會顯得繁瑣。C11 引入了 Lambda 函數&#xff0c;它是一種匿名函數&#xff0c;可以在需要的地方直接定義…