最近工作方面没有太多事,所以难得有些空闲时间,针对当前音视频app的流行,为了不让自己淘汰,提升自己的专业能力,于是决定学习安卓平台音视频开发相关知识,然而自己这方面却是一个小白,所以希望通过博客的形式记录下自己一步一步学习的过程,也希望能给这方面的新手一些借鉴。
学习计划1.了解音视频的基础知识
2.了解SurfaceView,TextureView的实现和使用
3.Android平台音频采集与播放(AudioRecord相关API)
4.Android平台视频采集与播放(Camera相关API)
5.学习 Android 平台的 MediaExtractor 和 MediaMuxer API
6.了解OpenGL ES,学会使用OpenGL绘制图形
7.学习MediaCodec API
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,这个在以后的学习中再深入了解。
作者:GdinKing