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.rhkb.cn/news/37682.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第十五天 | 数组 |长度最小的子数组和螺旋矩阵II

长度最小的子数组 【题目简介】 【自写数组解法】 class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:minLength float(inf)slow 0fast 0cur_sum nums[slow]# 终止条件&#xff1a;fast不能超过最大索引值while slow < fast and fas…

JVM常用概念之身份哈希码

问题 当我们调用Object.hashCode时&#xff0c;如果没有用户没有提供哈希码&#xff0c;会发生什么&#xff1f; System.identityHashCode如何工作&#xff1f;它是否获取对象地址&#xff1f; 基础知识 在 Java 中&#xff0c;每个对象都有equals和hashCode &#xff0c;即…

Compose 实践与探索十六 —— 与传统的 View 系统混用

Compose 发展初期的几年&#xff0c;会是新的模块用 Compose 写&#xff0c;然后逐渐的把老界面从 View 替换成 Compose 组件&#xff0c;直到全部或几乎全部是 Compose 代码的模式。 原生的 SurfaceView 与 TextureView 的重点是在它们底层的 Surface API&#xff0c;而不是 V…

[7-01-03].SpringBoot3集成MinIo

MinIO学习大纲 一、Spingboot整合MinIo 第1步&#xff1a;搭建SpringBoot项目&#xff1a; 第2步&#xff1a;引入minio依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…

xLua_001 Lua 文件加载

xLua下载 1、HelloWrold 代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; // 引入XLua命名空间 public class Helloworld01 : MonoBehaviour {//声明LuaEnv对象 private LuaEnv luaenv;void Start(){//实例化LuaEnv对象…

Redis 管道(Pipeline)深度解析:原理、场景与实战

一、为什么需要管道? 1. Redis 的请求/响应模式瓶颈 在传统 Redis 交互中: 客户端:发送命令1 → 等待响应 → 发送命令2 → 等待响应... 每次操作都需要经历: 网络传输时间 服务器处理时间 客户端阻塞等待时间 性能损耗:当需要执行大量命令时,频繁的网络往返(RTT)成…

OSPF-8 OSPF特殊区域NSSA

上一期我们介绍了特殊区域Stub区域,描述了Stub区域是如何来缩减LSA的数量以及下发LSA路由信息的 但由于Stub以及Stub区域虽然达到了缩减LSA数量的目的,但是无法引入外部路由信息所以这章我们来介绍OSPF的NSSA特殊区域,来看看NSSA区域与Stub区域有什么区别 一、概述 Stub区域与…

upload-labs靶场学习记录2

pass-2 打开靶场 提示这关与mime进行检查。 所以我们上传1.php文件并且抓包。 抓到包&#xff0c;我们修改对应的Content-Typed的类型为image/jpeg来伪造数据&#xff0c;让后端以为我们传入的是一个图片文件。 点击发送查看回传&#xff0c;复制图片的链接。 打开蚁剑&…

【C++】多态

目录 文章目录 前言 一、多态的概念 二、多态的定义及实现 三、重载/重写/隐藏的对比 四、纯虚函数和抽象类 五、多态的原理 总结 前言 本文主要讲述C中的多态&#xff0c;涉及的概念有虚函数、协变、纯虚函数、抽象类、虚表指针和虚函数表等。 一、多态的概念 多态分…

k8s部署prometheus+alertmanager+grafana监控

1、下载prometheus.yaml文件 根据github上面的版本对应说明&#xff0c;选择我们要下载的版本&#xff0c;github地址 rootiZj6c72dzbei17o2cuksmeZ:~# wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.14.0.tar.gz rootiZj6c72dzbei17o2cu…

扩展卡尔曼滤波

1.非线性系统的线性化 标准卡尔曼滤波 适用于线性化系统&#xff0c;扩展卡尔曼滤波 则扩展到了非线性系统&#xff0c;核心原理就是将非线性系统线性化&#xff0c;主要用的的知识点是 泰勒展开&#xff08;我另外一篇文章的链接&#xff09;&#xff0c;如下是泰勒展开的公式…

【从0实现muduo库系列】第二讲:基础类型与工具类

0 章节重点 重点内容 视频讲解&#xff1a;《CLinux编程进阶&#xff1a;从0实现muduo C网络框架系列》-第2讲.基础类型与工具类 代码改动 cp -r lesson1 lesson2 实现&#xff1a;base/Types.h 实现&#xff1a;base/copyable.h和noncopyable.h 实现&#xff1a;base/Str…

Qemu-STM32(十):STM32F103开篇

简介 本系列博客主要描述了STM32F103的qemu模拟器实现&#xff0c;进行该项目的原因有两点: 作者在高铁上&#xff0c;想在STM32F103上验证一个软件框架时&#xff0c;如果此时掏出开发板&#xff0c;然后接一堆的线&#xff0c;旁边的人估计会投来异样的目光&#xff0c;特别…

鸿蒙HarmonyOS NEXT应用崩溃分析及修复

鸿蒙HarmonyOS NEXT应用崩溃分析及修复 如何保证应用的健壮性&#xff0c;其中一个指标就是看崩溃率&#xff0c;如何降低崩溃率&#xff0c;就需要知道存在哪些崩溃&#xff0c;然后对症下药&#xff0c;解决崩溃。那么鸿蒙应用中存在哪些崩溃类型呢&#xff1f;又改如何解决…

K8S-etcd服务无法启动问题排查

一、环境、版本信息说明 k8s&#xff1a;v1.19.16 etcdctl version: 3.5.1 3台etcd&#xff08;10.xxx.xx.129、10.xxx.xx.130、10.xxx.xx.131&#xff09;组成的集群。 二、问题根因 129节点的etcd数据与其他两台数据不一致&#xff0c;集群一致性校验出错导致无法加入集…

【视觉提示学习】3.21论文随想

. . Frontiers of Information Technology & Electronic Engineering. 2024, 25(1): 42-63 https://doi.org/10.1631/FITEE.2300389 中文综述&#xff0c;根据里面的架构&#xff0c;把视觉提示学习分成两类&#xff0c;一类是单模态提示学习&#xff08;以vit为代表&…

基于SpringBoot的“校园招聘网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园招聘网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…

爱普生晶振FC2012AA汽车ADAS主控制系统的理想选择

在汽车智能化的浪潮中&#xff0c;先进驾驶辅助系统&#xff08;ADAS&#xff09;正迅速成为现代汽车的核心技术之一。ADAS 系统通过集成多种传感器、摄像头和高性能芯片&#xff0c;实现对车辆周围环境的实时监测和智能决策&#xff0c;为驾驶者提供全方位的安全保障。而在这一…

基于 ABAP RESTful 应用程序编程模型开发 OData V4 服务

一、概念 以个人图书管理为例&#xff0c;创建一个ABAP RESTful 应用程序编程模型项目。最终要实现的效果&#xff1a; 用于管理书籍的程序。读取、修改和删除书籍。 二、Data Model-数据模型 2.1 创建项目基础数据库表 首先&#xff0c;创建一个图书相关的表&#xff0c;点…

阿里云平台服务器操作以及发布静态项目

目录&#xff1a; 1、云服务器介绍2、云服务器界面3、发布静态项目1、启动nginx2、ngixn访问3、外网访问测试4、拷贝静态资源到nginx目录下并重启nginx 1、云服务器介绍 2、云服务器界面 实例详情&#xff1a;里面主要显示云服务的内外网地址以及一些启动/停止的操作。监控&…