Android音视频多媒体开源库基础大全

发布于:2025-03-22 ⋅ 阅读:(15) ⋅ 点赞:(0)

从事音视频开发工作,需要了解哪些常见的开源库,从应用到底软系统,整理了九大类,这里一次帮你总结完。

包含了应用层的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();

在这里插入图片描述

总结

本文根据博主工作经验,汇总了系统从上到下,作为多媒体开发相关的岗位中,工程师们都会用到的哪些开源库。

掌握这些,有助于更好的分析问题以及查漏补缺,成为多媒体领域的全栈工程师。

本文只做简单的梳理,篇幅有限,且一些库并非博主专长不能做到面面俱到。

如有学习需要可以参考其他详细资料资料,本系列整理完之后我会把相关的学习资料也汇总分享。

部分库会结合相关的经验,再根据实际问题进行详细补充。

创作不易,本来以为之前做音视频多媒体技术栈梳理时已经有草稿,真的开始这个系列,确实有些难度,希望对你有所帮助。

最近关注量持续增加,咬牙也要坚持,觉得有用,欢迎点赞支持。