Android音视频开发(一)音视频基础知识_android audiorecord 硬件加速-程序员宅基地

技术标签: 安卓进阶  音视频  android  音视频开发  安卓开发  

前言

最近难得有些空闲时间,想学点新的东西,针对当前音视频app的流行,于是决定学习安卓平台音视频开发相关知识,然而自己这方面却是一个小白,所以希望通过博客的形式记录下自己一步一步学习的过程,也希望能给这方面的新手一些借鉴。

学习计划

1.了解音视频的基础知识

2.了解SurfaceView,TextureView的实现和使用

3.Android平台音频采集与播放(AudioRecord相关API)

4.Android平台视频采集与播放(Camera相关API)

5.学习 Android 平台的 MediaExtractor 和 MediaMuxer API

6.学习MediaCodec API

7.了解OpenGL ES,学会使用OpenGL绘制图形

8.进一步学习OpenGL,了解如何实现视频的剪裁、旋转、水印、滤镜等

9.学习GLSurfaceView的使用

10.学习使用第三方库ffmpeg

11.了解RTMP,RTSP,学习使用第三方库librtmp

整个学习计划大概就这么多,如果以后深入了解涉及到其他再补充,最后我将使用以上涉及的技术开发一个简易的音视频app,这是一个漫长的过程,希望自己能坚持下去,共勉!

接下来正式进入正轨:

视频基础知识

1.什么是视频?

简单来说,视频可以看作是由一张张图片快速进行切换,在人眼中产生一段连贯的动作,早期电影胶片是个很明显的例子,通过记录在每一格胶片上的图像,进行快速切换,从而产生了视频效果。

2.帧

帧——就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头,每一张图像就是一帧,一个视频就是由许许多多帧组成的。

3.帧率

帧率是指帧连续出现在显示器上的频率(速率),玩游戏的童鞋肯定对这个不陌生,通常我们都会用FPS为单位,即每秒更新的帧数(帧/秒)。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps人眼一般就不容易察觉到有明显的流畅度提升了。

4.色彩空间

RGB:一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。屏幕上的所有颜色,都由红色绿色蓝色三种色光按照不同的比例混合而成的,这三种颜色又被成为三原色光。

YUV:YUV是被欧洲电视系统所采用的一种颜色编码方法,在现代彩色电视系统中,通常采用摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号B-Y(即U)、R-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去,这就是电视信号的传输过程。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。其中"Y"表示明亮度,也就是灰阶值;而"U"和"V" 表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。

采用YUV的优势:

一.彩色YUV图像转黑白YUV图像转换非常简单,这一特性用在于电视信号上。

二.YUV的数据总尺寸小于RGB格式,这对缩小视频体积提供了便利。

RGB与YUV之间的转换方法:

Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

音频基础知识

1.什么是音频?

这里的音频是指存储声音内容的介质,任何我们可以听见的声音经过音频线或话筒的传输都会变成一系列的模拟信号。在CD时代,声音被物理手段收集刻录在磁带介质中,这一过程全是模拟的,存在声音失真的情况;而在数码时代,声音都被处理成数字信号存储在存储介质中,模拟信号是我们可以听见的,而数字信号就是用一堆数字记号(二进制的1和0)来记录声音,数字信号可以实现对声音的无损保存。

数码录音最关键的步骤就是把模拟信号转成数字信号,这里不得不提一个名词:脉冲编码调制(PCM),是一种数字数据的处理机制,具体请看百科。

PCM的工作过程如下:

模拟信号->采样->量化->编码->数字信号

2.采样率与采样位数

采样是通过周期性地以某一规定间隔截取音频信号,从而将模拟音频信号变换为数字信号的过程。每次采样时均指定一个表示在采样瞬间的音频信号的幅度的数字。

采样频率指录音设备在一秒钟内对声音信号的采样次数,根据奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。也就是说我们对声音进行收集处理时,要针对性地对每一段特定频率的声音进行选取。

人耳能听到的最高频率为20kHz,所以为了满足人耳的听觉要求,采样率至少为40kHz,通常为44.1kHz,更高的通常为48kHz。

采样位数即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。采样的位数和采样的频率决定了声音采集的质量。

数字信号中,信号一般是不连续的,所以模拟信号量化以后,只能取一个近似的整数值,为了记录这些振幅值,采样器会采用一个固定的位数来记录这些振幅值,通常有8位、16位、32位。8位代表2的8次方——256,16位则代表2的16次方——64K,32位代表2的32次方——2147483648,位数越高,声音质量越好。

3.声道

声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。通常我们说的立体声一般有2个声道,有些更高级的有4个声道。

4.码率

码率是指每秒传送的比特(bit)数,单位bps(bit per second),通常使用kbps(每秒钟1000比特)。在音频中指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标。码率高时文件大小变大,会占据很多的内存容量,音乐文件最常用的码率是128kbps,MP3文件可以使用的一般是8-320kbps。

码率(kbps) = 采样率(kHz)× 采样位数(bit/采样点)× 声道数量(一般为2)

视频编码

1.什么是视频编码?

就是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式。从信息论的观点来看,数据=信息+数据冗余。视频信号也存在数据冗余,视频编码的实质是减少视频中的冗余数据。我们知道,视频是由帧组成的,但是在实际使用中,视频的数据并不是真正按照一帧一帧原始数据保存下来的,而是通过压缩编码后存储。视频编码能有效减少视频大小,方便传输和存储。视频和音频通过压缩编码合并后就变成了我们常见的格式,如:avi、mp4、rmvb、mov等,这些称为视频封装格式。

2.视频编码格式

视频流传输中最为重要的编解码标准有国际电联的H.261、H.263、H.264,运动静止图像专家组的M-JPEG国际标准化组织运动图像专家组的MPEG系列标准等等。其中最主流的是H.264,当然现在已经推出H.265,这是一种更高效的编码方式,比上一代的压缩效率更高。

3.H.264编码

因为H.264编码太过庞大复杂,实际开发中,编码部分工作一般由第三方框架完成,开发者其实并不太需要去涉猎,我这里就不详细介绍了,具体请看百度百科

也可参考入门理解H264编码

音频编码

1.什么是音频编码?

参照视频编码,音频编码自然是对音频数据进行压缩处理的过程。

2.音频编码格式

PCM编码:前面我们已经介绍过了,这种编码最大的优点就是音质好,最大的缺点就是体积大。

和视频编码一样,音频也有许多的编码格式,如:WAV、MP3、WMA、APE、FLAC等等。

我这里着重介绍AAC,AAC是新一代的音频有损压缩技术,一种高压缩比的音频压缩算法。在MP4视频中的音频数据,大多数时候都是采用AAC压缩格式。

3.AAC编码

AAC是一种专为声音数据设计的文件压缩格式。与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,可使人感觉声音质量没有明显降低的前提下,占用存储空间更小。

AAC格式主要分为两种:ADIF、ADTS。

ADIF:Audio Data Interchange Format。 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。这种格式常用在磁盘文件中。

ADTS:Audio Data Transport Stream。 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

参考AAC文件解析及解码流程

硬件加速

硬件加速(Hardware acceleration)就是利用硬件模块来替代软件算法以充分利用硬件所固有的快速特性。硬件加速通常比软件算法的效率要高。

将2D、3D图形计算相关工作交给GPU处理,从而释放CPU的压力,也是属于硬件加速的一种。

硬解码和软解码

1.区别

硬解码和上面的硬件加速对应,即使用硬件模块来解析视频、音频文件等,而软解码即是用CPU去计算解析。

硬解码是将原来全部交由CPU来处理的视频数据的一部分交由GPU来做,而GPU的并行运算能力要远远高于CPU,这样可以大大的降低对CPU的负载,CPU的占用率较低了之后就可以同时运行一些其他的程序了。

软解码具有更好的适应性,软件解码主要是会占用CPU的运行,软解不考虑设备的硬件解码支持情况,有CPU就可以使用了,但是占用了更多的CPU那就意味着很耗费性能,很耗电,在设备电量充足的情况下,或者设备硬件解码支持不足的情况下使用软件解码更加好。

一般的视频播放器都会支持软硬解码,两者相结合从而发挥最优性能。

2.Android平台的解码

安卓硬解码可以直接使用MediaCodec(API 16之后引入) ,虽然MediaPlayer也是硬件解码,但是被封装得太死了,支持的协议很少。

对于软解码,有许多第三方框架支持,最出名的莫过于ffmpeg,这个在以后的学习中再深入了解。

后记:强烈建议看官方的文档:谷歌音频和视频介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gs12software/article/details/104754429

智能推荐

2022年全网最全的Oracle数据库技术附练习题以及答案 循序渐进_oracel大数据量进阶练习-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏33次。前言【本章末尾给大家留下了大量的福利】 1.什么是数据库?>> 存储数据的仓库2.常见的数据库有哪些?Oracle>>甲骨文Mysql>>甲骨文SQLServer>>微软Access>>微软DB2>>IBM人大金仓>>国产 3.生活中哪些地方使用数据库?超市商品管理系统>>商品信息网上购物商城>>商品信息和账户信息银行管理系统>>账户信息12306>>账户信息和车次信息一、数据库发展史1.1 程序管理阶段20世纪50年代中前期特点:数据不能长期保存1.2 文件系统阶段20世纪50年代后期-->20世纪60年_oracel大数据量进阶练习

Python入门——安装与PIP_pip install panders-程序员宅基地

文章浏览阅读521次。Python入门——安装与PIPPython下载安装版本控制各个版本安装到不同目录下:版本设置:运行运行pip37版本:运行python38版本:PIP换源临时使用pip源方法:永久换源方法:Linux方法:Windows方法:pip使用pip介绍依赖包查询pip说明:pip安装某一个库:pip卸载某个库pip升级某个包pip列出当前已经安装可升级的包pip批量升级过期包使用pip-review批..._pip install panders

2019秋招:460道Java后端面试高频题答案版【模块二:Java集合类】-程序员宅基地

文章浏览阅读1.3w次。点击上方“码农进阶之路”,选择“设为星标”回复“面经”获取面试资料 来源:https://url.cn/5dVANAQ 说明:答案来自于我的秋招复习笔记,但是答案都是..._使用hashset存储数据,并不是按添加的顺序存储;不管数据所处的位置,访问数据的速度

Docker的数据卷和数据卷容器_docker容器和数据盘对应-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏11次。在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。 容器中数据管理主要有两种方式:数据卷和数据卷容器。数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。数据卷容器(Data Volume Containers) 使用特定容器维护数据卷。数据卷数据卷是一个特殊的目录,它将主机目录直接映射进容器。可_docker容器和数据盘对应

mysql字符串分割_mysql字符串分割函数(行转列)-程序员宅基地

文章浏览阅读1.4k次。由于工作需要需要处理一些以逗号分隔的字符串,每次都要现做很是麻烦,网上找了很多都没有现成的,好吧,自己动手写一个好了1 CREATE DEFINER = `harri`@`%` FUNCTION `str_for_substr`(`num` int, `str` varchar(5000))2 RETURNS varchar(100)3 BEGIN4 /*函数功能: 把带逗号的字符串分割..._mysql 字符串分割行转列

Vue3.x新特性总结及与vue2.x的对比-程序员宅基地

文章浏览阅读513次。vue3.xVue3.x与Vue2.x的区别生命周期不同template模板支持多个根标签响应式对象函数refreactivetoRefs监听属性watch和watchEffect的区别watchwatchEffectVue3.x与Vue2.x的区别生命周期不同Vue2.xVue3.xbeforeCreatesetup()createsetup()beforeMountonBeforeMountmountedonMountedbeforeUpdate_vue3.x新特性总结及与vue2.x的对比

随便推点

centos7安装python3.62出现pip错误_使用yum工具在CentOS7系统下安装python-pip错误时的对应技巧...-程序员宅基地

文章浏览阅读270次。pip简介 pip 是一个Python计算机程序语言写成的软件包管理系统,它可以安装和管理软件包有时我们在使用centos7的软件包管理程序yum安装python-pip的时候会报一下错误:No package python-pip available. Error: Nothing to do翻译过来即是说没有python-pip软件包可以安装。这是因为像centos这类衍生出来的发行版,他们的..._安装 pip时出现 no package python-pip available. error: nothing to do错误、

飞思卡尔MC9S12G64串口发送接收驱动_s12z 串口-程序员宅基地

文章浏览阅读1.6k次。因为之前刚入职,对串口调试不了解,下面整理一下书上的串口程序。 移植性还比较强使用说明:MC9S12系列的串口有两种查询方式 1》使用中断方式查询 2》在主函数中使用轮询的方式的方法进行查询 这两种方法在下面函数中都有体现,需要在用的时候注意分别提取 主要是初始化的SCI1..._s12z 串口

DS Video for Android TV (稳定安装打开版)_ds video tv版-程序员宅基地

文章浏览阅读1.4k次。这个 apk 只支持到 Android 5.0 以上的版本。Android 5.0 以下的就不用试了。要想在普通的 Android 系统电视盒子上使用 DS Video for Android TV 版,DS Video for Android TV 版的 apk 请直接去群晖官网的下载中心下载吧。需要附件里的这个 apk 和 群晖官网下载中心下载的那个 apk 这两个都安装上才可以._ds video tv版

785. Is Graph Bipartite?-程序员宅基地

文章浏览阅读54次。https://leetcode.com/problems/is-graph-bipartite/discuss/115487/Java-Clean-DFS-solution-with-Explanation 1 class Solution { 2 int[] colors; 3 public boolean isBipartite(int[..._is graph byparti

harmonyos20官网,harmonyos 2.0-harmonyos 2.0系统官方预约 v1.0-优盘手机站-程序员宅基地

文章浏览阅读382次。harmonyos 2.0是华为打造的新系统,这个系统也将在2020 年华为开发者大上亮相,相信广大的用户们一定都期待很久了吧!不仅手机支持,包括平板、手表在内的产品也将搭载这各系统,是不是很给力呢?感兴趣的朋友赶紧来看看。harmonyos 2.0特色:1、这次的系统也是经过全面升级的,系统也会更加的刘畅的;2、实现了多设备融合为 “一个设备”的功能,这一点我觉得特别好;3、还加入了强大的分布式..._华为harmonyos20手机版

万字长文!二叉树入门和刷题看这篇就够了!-程序员宅基地

文章浏览阅读908次,点赞3次,收藏6次。今天是小浩算法 “365刷题计划” 二叉树入门 - 整合篇。本篇作为入门整合篇,已经砍去难度较大的知识点,所有列出的内容,均为必须掌握。因为很长,写下目录:二叉树是啥二叉树的最大深度(D..._万字长文,二叉树

推荐文章

热门文章

相关标签