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.mzph.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;可以在需要的地方直接定义…