您当前所在位置:ag旗舰厅 > 热门新闻 >

Android 音视频开篇:基础知识(硬解码)

现在录一、Android音视频硬解码篇:1,音视频基础知识2,音视频硬解码流程:封装基础解码框架3,音视频播放:音视频同步4,音视频解封和封装:生成一个MP4二、行使OpenGL渲染视频画面篇1,初步晓畅OpenGL ES2,行使OpenGL渲染视频画面3,OpenGL渲染众视频,实现画中画4,深入晓畅OpenGL之EGL5,OpenGL FBO数据缓冲区6,Android音视频硬编码:生成一个MP4三、Android FFmpeg音视频解码篇1,FFmpeg so库编译2,Android 引入FFmpeg3,Android FFmpeg视频解码播放4,Android FFmpeg+OpenSL ES音频解码播放5,Android FFmpeg+OpenGL ES播放视频6,Android FFmpeg浅易相符成MP4:视屏解封与重新封装7,Android FFmpeg视频编码本文你能够晓畅到行为开篇的文章,吾们先来望望音视频由什么构成的,以及一些常见的术语和概念。一、视频是什么?动画书

不晓畅行家幼时候是否玩过一栽动画幼人书,不息翻动的时候,幼人书的画面就会变成一个动画,相通现在的gif格式图片。

正本是一本静态的幼人书,经由过程翻动以后,就会变成一个趣味的幼动画,倘若画面够众,翻动速度够快的话,这其实就是一个幼视频。

而视频的原理正是如此,原由人类眼睛的稀奇结构,画面迅速切换时,画面会有残留,感觉首来就是连贯的行为。于是,视频就是由一系列图片构成的。

视频帧

帧,是视频的一个基本概念,外示一张画面,如上面的翻页动画书中的一页,就是一帧。一个视频就是由许很众众帧构成的。

帧率

帧率,即单位时间内帧的数目,单位为:帧/秒 或fps(frames per second)。如动画书中,一秒内包含众少张图片,图片越众,画面越顺滑,过渡越自然。

帧率的清淡以下几个典型值:

24/25 fps:1秒 24/25 帧,清淡的电影帧率。

30/60 fps:1秒 30/60 帧,游玩的帧率,30帧能够批准,60帧会感觉更添流畅真切。

85 fps以上人眼基本无法察觉出来了,于是更高的帧率在视频里异国太大意义。

色彩空间

这边吾们只讲常用到的两栽色彩空间。

RGB

RGB的颜色模式答该是吾们最熟识的一栽,在现在的电子设备中行使普及。经由过程R G B三栽基础色,能够同化出所有的颜色。

YUV

这边偏重讲一下YUV,这栽色彩空间并不是吾们熟识的。这是一栽亮度与色度别离的色彩格式。

早期的电视都是暗白的,即只有亮度值,即Y。有了彩色电视以后,添入了UV两栽色度,形成现在的YUV,也叫YCbCr。

Y:亮度,就是灰度值。除了外示亮度信号外,还含有较众的绿色通道量。

U:蓝色通道与亮度的差值。

V:红色通道与亮度的差值。

采用YUV有什么上风呢?

人眼对亮度敏感,对色度不敏感,因此缩短片面UV的数据量,人眼却无法感知出来,如许能够经由过程压缩UV的分辨率,在不影响不益看感的前挑下,减幼视频的体积。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
二、音频是什么?

音频数据的承载手段最常用的是脉冲编码调制,即PCM。

在自然界中,声音是不息不息的,是一栽模拟信号,那怎样才能把声音保存下来呢?那就是把声音数字化,即转换为数字信号。

吾们晓畅声音是一栽波,有本身的振幅和频率,那么要保存声音,就要保存声音在各个时间点上的振幅。

而数字信号并不及不息保存所未必间点的振幅,原形上,并不必要保存不息的信号,就能够还原到人耳可批准的声音。

根据奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率答该不幼于模拟信号频谱中最高频率的2倍。

根据以上分析,PCM的采集步骤分为以下步骤:

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

采样率和采样位数

采样率,即采样的频率。

上面挑到,采样率要大于原声波频率的2倍,人耳能听到的最高频率为20kHz,于是为了已足人耳的听觉请求,采样率起码为40kHz,清淡为44.1kHz,更高的清淡为48kHz。

采样位数,涉及到上面挑到的振幅量化。波形振幅在模拟信号上也是不息的样本值,而在数字信号中,信号清淡是不不息的,于是模拟信号量化以后,只能取一个近似的整数值,为了记录这些振幅值,采样器会采用一个固定的位数来记录这些振幅值,清淡有8位、16位、32位。

位数最幼值最大值8025516-327683276732-21474836482147483647

位数越众,记录的值越实在,还原度越高。

末了就是编码了。原由数字信号是由0,1构成的,因此,必要将幅度值转换为一系列0和1进走存储,也就是编码,末了得到的数据就是数字信号:一串0和1构成的数据。

整个过程如下:

声道数

声道数,是指声援能分别发声(着重是分别声音)的音响的个数。

单声道:1个声道双声道:2个声道立体声道:默认为2个声道立体声道(4声道):4个声道码率

码率,是指一个数据流中每秒钟能经由过程的新闻量,单位bps(bit per second)

码率 = 采样率 * 采样位数 * 声道数三、为什么要编码

这边的编码和上面音频中挑到的编码不是同个概念,而是指压缩编码。

吾们晓畅,在计算机的世界中,总共都是0和1构成的,音频和视频数据也不破例。原由音视频的数据量壮大,倘若遵命裸流数据存储的话,那将必要消耗特意大的存储空间,也不幸于传送。而音视频中,其实包含了大量0和1的重复数据,因此能够经由过程肯定的算法来压缩这些0和1的数据。

稀奇在视频中,原由画面是逐渐过渡的,因此整个视频中,包含了大量画面/像素的重复,这正益挑供了特意大的压缩空间。

因此,编码能够大大减幼音视频数据的大幼,让音视频更容易存储和传送。

四、视频编码视频编码格式

视频编码格式有很众,比如H26x系列和MPEG系列的编码,这些编码格式都是为了适宜时代发展而展现的。

其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)国际电传视讯联盟主导

MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的布局)主导。

自然,他们也有说相符制定的编码标准,那就是现在主流的编码格式H264,自然还有下一代更先辈的压缩编码标准H265。

H264编码简介

H264是现在最主流的视频编码标准,于是吾们后续的文章中主要以该编码格式为基准。

H264由ITU和MPEG共同定制,属于MPEG-4第十片面内容。

原由H264编码算法相等复杂,不是暂时半刻能够讲隐微的,也不在本人现在的能力周围内,于是这边只浅易介绍在日常开发中必要晓畅到的概念。实际上,视频的编码息争码片面清淡由框架(如Android硬解/FFmpeg)完善,清淡的开发者并不会接触到。视频帧

吾们已经晓畅,视频是由一帧一帧画面构成的,但是在视频的数据中,并不是真实遵命一帧一帧原首数据保存下来的(倘若如许,压缩编码就异国意义了)。

H264会根据一段时间内,画面的转折情况,选取一帧画面行为完善编码,下一帧只记录与上一帧完善数据的差别,是一个动态压缩的过程。

在H264中,三栽类型的帧数据别离为

I帧:帧内编码帧。就是一个完善帧。

P帧:前向展望编码帧。是一个非完善帧,经由过程参考前线的I帧或P帧生成。

B帧:双向展望内插编码帧。参考前后图像帧编码生成。B帧倚赖其前比来的一个I帧或P帧及其后比来的一个P帧。

图像组:GOP和关键帧:IDR

全称:Group of picture。指一组转折不大的视频帧。

GOP的第一帧成为关键帧:IDR

IDR都是I帧,能够防止一帧解码出错,导致后面所有帧解码出错的题目。当解码器在解码到IDR的时候,会将之前的参考帧清空,重新最先一个新的序列,如许,即便前线一帧解码展现宏大舛讹,也不会蔓延到后面的数据中。

注:关键帧都是I帧,但是I帧纷歧定是关键帧DTS与PTS

DTS全称:Decoding Time Stamp。标示读入内存中数据流在什么时候最先送入解码器中进走解码。也就是解码挨次的时间戳。

PTS全称:Presentation Time Stamp。用于标示解码后的视频帧什么时候被表现出来。

在异国B帧的情况下,DTS和PTS的输出挨次是相通的,一旦存在B帧,PTS和DTS则会分别。帧的色彩空间

前线吾们介绍了RGB和YUV两栽图像色彩空间。H264采用的是YUV。

YUV存储手段分为两大类:planar 和 packed。

planar:先存储所有Y,紧接着存储所有U,末了是V;packed:每个像素点的 Y、U、V 不息交叉存储。

planar如下:

packed如下:

不过pakced存储手段已经特意少用,大片面视频都是采用planar存储手段。

上面说过,原由人眼对色度敏感度矮,于是能够经由过程省略一些色度新闻,即亮度共用一些色度新闻,进而撙节存储空间。因此,planar又区分了以下几栽格式: YUV444、 YUV422、YUV420。

YUV 4:4:4采样,每一个Y对答一组UV分量。

YUV 4:2:2采样,每两个Y共用一组UV分量。

YUV 4:2:0采样,每四个Y共用一组UV分量。

其中,最常用的就是YUV420。

YUV420格式存储手段

YUV420属于planar存储手段,但是又分两栽类型:

YUV420P:三平面存储。数据构成为YYYYYYYYUUVV(如I420)或YYYYYYYYVVUU(如YV12)。

YUV420SP:两平面存储。分为两栽类型YYYYYYYYUVUV(如NV12)或YYYYYYYYVUVU(如NV21)

关于H264的编码算法和数据结构,涉及的知识和篇幅很众(如网络抽象层NAL、SPS、PPS),本文不再深入细说,网上也有比较众的教程讲解,趣味味能够自走深入学习。

入门理解H264编码

五、音频编码音频编码格式

原首的PCM音频数据也是特意大的数据量,因此也必要对其进走压缩编码。

和视频编码相通,音频也有很众的编码格式,如:WAV、MP3、WMA、APE、FLAC等等,音笑发烧友答该对这些格式特意熟识,稀奇是后两栽无损压缩格式。

但是,吾们今天的主角不是他们,而是另外一个叫AAC的压缩格式。

AAC是新一代的音频有损压缩技术,一栽高压缩比的音频压缩算法。在MP4视频中的音频数据,大无数时候都是采用AAC压缩格式。

AAC编码简介

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

ADIF:Audio Data Interchange Format。 音频数据交换格式。这栽格式的特征是能够确定的找到这个音频数据的最先,不需进走在音频数据流中心最先的解码,即它的解码必须在清晰定义的最先处进走。这栽格式常用在磁盘文件中。

ADTS:Audio Data Transport Stream。 音频数据传输流。这栽格式的特征是它是一个有同步字的比特流,解码能够在这个流中任何位置最先。它的特征相通于mp3数据流格式。

ADTS能够在肆意帧解码,它每一帧都有头新闻。ADIF只有一个同一的头,于是必须得到所有的数据后解码。且这两栽的header的格式也是分别的,现在清淡编码后的都是ADTS格式的音频流。

ADIF数据格式:

headerraw_data

ADTS 一帧 数据格式(中心片面,旁边省略号为前后数据帧):

AAC内部结构也不再赘述,能够参考AAC 文件解析及解码流程

六、音视频容器

详细的读者能够已经发现,前线吾们介绍的各栽音视频的编码格式,异国一栽是吾们一般行使到的视频格式,比如:mp4、rmvb、avi、mkv、mov...

没错,这些吾们熟识的视频格式,其实是包裹了音视频编码数据的容器,用来把以特定编码标准编码的视频流和音频流混在一首,成为一个文件。

例如:mp4声援H264、H265等视频编码和AAC、MP3等音频编码。

mp4是现在最通走的视频格式,在移动端,清淡将视频封装为mp4格式。七、硬解码和柔解码硬解和柔解的区别

吾们在一些播放器中会望到,有硬解码和柔解码两栽播放形态给吾们选择,但是吾们大片面时候并不及感觉出他们的区别,对于清淡用户来说,只要能播放就走了。

那么他们内部原形有什么区别呢?

在手机或者PC上,都会有CPU、GPU或者解码器等硬件。清淡,吾们的计算都是在CPU上进走的,也就是吾们柔件的实走芯片,而GPU主要负责画面的表现(是一栽硬件添速)。

所谓柔解码,就是指行使CPU的计算能力来解码,清淡倘若CPU的能力不是很强的时候,一则解码速度会比较慢,二则手机能够展现发炎表象。但是,原由行使同一的算法,兼容性会很益。

硬解码,指的是行使手机上特意的解码芯片来添速解码。清淡硬解码的解码速度会快很众,但是原由硬解码由各个厂家实现,质量杂乱无章,特意容易展现兼容性题目。

Android平台的硬解码终于来到相关Android的片面了,行为本文的末了,也算是为下一篇文章开一个头。

MediaCodec 是Android 4.1(api 16)版本引入的编解码接口,是所有想在Android上开发音视频的开发人员绕不开的坑。

原由Android碎片化主要,固然经过众年的发展,Android硬解已经有了很大改不益看,但实际上各个厂家实现分别, 照样会有一些意料不到的坑。

相对于FFmpeg,Android原生硬解码照样相对容易入门一些,于是接下来,吾将会从MediaCodec着手,讲解如何实现视频的编解码,以及引入OpenGL实现对视频的编辑,末了才引入FFmpeg来实现柔解,算是一个比较通例的音视频开发入门流程吧。