FFmpeg-基础理论与入门

简介

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源库,其主要功能是对数据的处理。使用c写的
主要是多媒体数据的处理,不涉及IO收集与GPU视频显示,这部分去读android源码。
此外与计算机网络有技术与类似问题实现方法方面相似的地方。

领域大牛:
https://blog.csdn.net/leixiaohua1020/article/list/11?
不论入门还是深入都可以参考他的文章,可惜25岁的博士生早逝..

本篇的参考文写于2014年,5年来许多技术已有长足进步,遇到将再补充。
这种实际使用起来性能差距很大的技术还是需要紧跟最新的技术才行…..比如先进的编码与传输方式

编译

使用win下linux子系统即可编译成功android版本的,不过NDK和FFmpeg都要旧版本的,我编译的是ndk14+ffmpeg3.4
configure的参数是关键

ffmpeg入门前置知识

使用在:
视频播放器内核-Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音,ijkplayer
直播过滤器-ffdshow,lav filters
转码工具内核-ffmpeg,格式工厂

入门ffmpeg前需要掌握些基本的音视频数据格式

理论层面的音视频技术

视频播放原理

音视频技术主要有
封装格式:把视频数据和音频数据打包成一个文件的规范,与编码标准无关。如:avi,rmvb,mp4,flv,mkv。支持的标准越多一般越好mkv>rmvb
视频压缩编码技术:视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。
音频压缩编码技术:音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。
流媒体协议技术:通信协议,socket之上

视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。

解协议:就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装:就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码:就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步:就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

流媒体协议

用于主机间的应用层的协议

名称 推出机构 传输层协议 客户端 目前使用领域
RTSP+RTP IETF TCP+UDP VLC, WMP IPTV
RTMP Adobe Inc. TCP Flash 互联网直播
RTMFP Adobe Inc. UDP Flash 互联网直播
MMS Microsoft Inc. TCP/UDP WMP 互联网直播+点播
HTTP WWW+IETF TCP Flash 互联网点播

点播:视频内容已经存放在服务器上(换句话说,我们能够得到该视频文件在服务器上的URL地址),我们可以选择性地播放某个视频。
直播:视频内容是实时录制的,与此同时,将音视频以媒体“流”的形式推到服务器上。此时,一旦有观众收看该直播,服务器收到响应后,会将媒体流传输至播放器,实现视频播放。

因为互联网网络环境的不稳定性,RTSP+RTP较少用于互联网视音频传输。互联网视频服务通常采用TCP作为其流媒体的传输层协议,因而像RTMP,MMS,HTTP这类的协议广泛用于互联网视音频服务之中。这类协议不会发生丢包,因而保证了视频的质量,但是传输的效率会相对低一些。

封装格式

封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。

名称 推出机构 流媒体 支持的视频编码 支持的音频编码 目前使用领域
AVI Microsoft Inc. 不支持 几乎所有格式 几乎所有格式 BT下载影视
MP4 MPEG 支持 MPEG-2, MPEG-4, H.264, H.263等 AAC, MPEG-1 Layers I, II, III, AC-3等 互联网视频网站
TS MPEG 支持 MPEG-1, MPEG-2, MPEG-4, H.264 MPEG-1 Layers I, II, III, AAC, IPTV,数字电视
FLV Adobe Inc. 支持 Sorenson, VP6, H.264 MP3, ADPCM, Linear PCM, AAC等 互联网视频网站
MKV CoreCodec Inc. 支持 几乎所有格式 几乎所有格式 互联网视频网站
RMVB Real Networks Inc. 支持 RealVideo 8, 9, 10 AAC, Cook Codec, RealAudio Lossless BT下载影视

除了AVI之外,其他封装格式都支持流媒体,即可以“边下边播”,总的来说,不同的封装格式之间差距不大,各有优劣。

视频编码

视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。

基本原理:https://blog.csdn.net/leixiaohua1020/article/details/28114081

名称 推出机构 推出时间 目前使用领域
HEVC(H.265) MPEG/ITU-T 2013 研发中
H.264 MPEG/ITU-T 2003 各个领域
MPEG4 MPEG 2001 不温不火
MPEG2 MPEG 1994 数字电视
VP9 Google 2013 研发中
VP8 Google 2008 不普及
VC-1 Microsoft Inc. 2006 微软平台

当前使用最多的视频编码方案就是H.264。
H.264仅仅是一个编码标准,而不是一个具体的编码器,H.264只是给编码器的实现提供参照用的。
实际中使用最多的就是x264了,性能强悍(超过了很多商业编码器),而且开源。

现在的编解码标准就要数HEVC和VP9了。VP9是Google继VP8之后推出的新一代标准。VP9和HEVC相比,要稍微逊色一些。
实际使用的HEVC开源编码器很有可能是x265。

下一代是H.266,2018年也标准化了。
HEVC > VP9 > H.264> VP8 > MPEG4 > H.263 > MPEG2

音频编码

音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。高效率的音频编码在同等的码率下,可以获得更高的音质。

名称 推出机构 推出时间 目前使用领域
AAC MPEG 1997 各个领域(新)
AC-3 Dolby Inc. 1992 电影
MP3 MPEG 1993 各个领域(旧)
WMA Microsoft Inc. 1999 微软平台

由表可见,近年来并未推出全新的音频编码方案,可见音频编码技术已经基本可以满足人们的需要。音频编码技术近期绝大部分的改动都是在MP3的继任者——AAC的基础上完成的。

AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3

现有网络视音频平台对比

直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H.264作为视频编码格式,AAC作为音频编码格式。
FLV是RTMP使用的封装格式

点播服务普遍采用了HTTP作为流媒体协议,H.264作为视频编码格式,AAC作为音频编码格式。

RGB、YUV视频像素数据

20160118002918690.png

只规定了像素的表示。
用于直接显示的像素数据,直接供硬件驱动使用,因此只规定了像素,问题1
用yuvplayer等可播放
RGB诉求于人眼对色彩的感应,YUV则着重于视觉对于亮度的敏感程度。
RGB没有抽样,全部显示。YUV也可以不抽样。

颜色

电磁波的波长和强度可以有很大的区别,在人可以感受的波长范围内(约312.30纳米至745.40纳米),它被称为可见光,有时也被简称为光。假如我们将一个光源各个波长的强度列在一起,我们就可以获得这个光源的光谱。一个物体的光谱决定这个物体的光学特性,包括它的颜色。

色素:印刷、彩笔等使用反射一定波长的色素,通过反射白光的一部分产生颜色效果。
RGB:发光的媒体(比如电视机)使用红、绿 和蓝加色的三元色,每种光尽可能只刺激针对它们的锥状细胞而不刺激其它的锥状细胞。这个系统的色域占人可以感受到的色彩空间的大部分,因此电视机和电脑萤幕使用这个系统。
HSB:在制作计算机图像时人们往往使用另一种颜色系统。这个颜色系统使用三项分类,分别叫做色相(hue)、饱和度(saturation)和明度(brightness)的系数。色调决定到底哪一种颜色被使用,饱和度决定颜色的纯度,亮度决定颜色的明暗程度。使用的原因是RGB不能直观的通过数值对应颜色。

色度抽样

https://zh.wikipedia.org/wiki/%E8%89%B2%E5%BA%A6%E6%8A%BD%E6%A0%B7
由于储存及传送的限制,讯号处理中大多数会偏向被减少(或被压缩)以减低负荷。由于人眼对色度的敏感度不及对亮度的敏感度,图像的色度分量不需要有和亮度分量相同的清晰度,所以许多视讯系统在色差通道上进行较低(相对亮度通道)清晰度(例如,抽样频率)的抽样。这样在不明显降低画面质量的同时降低了影像讯号的总带宽。因抽样而丢失的色度值用内插值,或者前一色度值来替代。在压缩影像中,以4:2:2 Y’CbCr作例,它只需R’G’B’(4:4:4)三分之二的带宽。带宽的减少在肉眼上几乎没有影像上差别。

YUV

YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度、浓度(Chrominance、Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。没有UV是黑白的。
YUV码流有多种不同的格式,要分析YUV码流,就必须搞清楚你面对的到底是哪一种格式,并且必须搞清楚这种格式的YUV采样和分布情况。

YUV格式有两大类:planar和packed。
紧缩格式(packed formats):将Y、U、V值存储成Macro Pixels数组,和RGB的存放方式类似。
平面格式(planar formats):将Y、U、V的三个分量分别存放在不同的矩阵中。

采样方式:YUV4:4:4,YUV4:2:2,YUV4:2:0 。YUV A:B:C的意思一般是指基于4个象素来讲,其中Y采样了A次,U采样了B次,V采样了C次.

24439730_13282389538k8V.jpg

常用420planar ,X264在进行编码的时候需要标准的YUV(4:2:0)

1
2
3
4
5
6
7
YUV420比较常用,分为YUV420p和YUV420sp
YUV420p:又叫planer平面模式,Y ,U,V分别再不同平面,也就是有三个平面。分为
I420:又叫YU12,安卓的模式。存储顺序是先存Y,再存U,最后存V。YYYYUUUVVV
YV12:存储顺序是先存Y,再存V,最后存U。YYYVVVUUU
YUV420sp:又叫bi-planer或two-planer双平面,Y一个平面,UV在同一个平面交叉存储。分为
NV12:IOS只有这一种模式。存储顺序是先存Y,再UV交替存储。YYYYUVUVUV
NV21:安卓的模式。存储顺序是先存Y,再VU交替存储。YYYYVUVUVU

内存计算420:
width hight =Y(总和) width hight为多少像素 Y占一个字节
U = Y / 4 V = Y / 4
所以一个YUV是1.5个字节用于表示一个像素。
分辨率:一帧视频的大小,表示长宽像素个数。
帧率:每秒钟视频帧数 FPS
所以采集大小为:width hight 1.5 frame time

RGB

很常见,可参考:
https://blog.csdn.net/byhook/article/details/84262330

也是要按不同格式分开处理

PCM音频采样数据

20160117235313221.png
是直接供音频驱动使用的数据流格式
用Adobe Audition可以查看PCM

采样频率:即取样频率,指每秒钟取得声音样本的次数。采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太高的频率并不能分辨出来。在16位声卡中有22KHz、44KHz等几级,其中,22KHz相当于普通FM广播的音质,44KHz已相当于CD音质了,目前的常用采样频率都不超过48KHz。
采样位数:即采样值或取样值(就是将采样样本幅度量化)。它是用来衡量声音波动变化的一个参数,也可以说是声卡的分辨率。它的数值越大,分辨率也就越高,所发出声音的能力越强。
声道数:单双
时长: 采样的时长

采样频率和采样位数越大,对模拟信号的拟合越好。

存储方式:
如果是单声道的音频文件,采样数据按时间的先后顺序依次存入(有的时候也会采用LRLRLR方式存储,只是另一个声道的数据为0),如果是双声道的话就按照LRLRLR的方式存储,存储的时候还和机器的大小端有关。
44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声);
22050HZ 8bit mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1字节)记录, 单声道;

视频编码的基本原理

数据冗余:空间冗余、时间冗余、结构冗余、信息冗余。图像像素间存在相关性,无损压缩
视觉冗余:人眼的特性,适量误差也行。有损压缩

具体的编码方法学习建议参考书籍。很数学理论的内容

音频编码的基本原理

冗余:音频中不能被人耳感知的信号。20Hz-20kHz。频谱掩蔽效应与时域掩蔽效应

封装与协议需根据项目需求分析,毕竟太多了,还是紧跟前沿标准好些。

FFmpeg入门

源码级跨平台

ffmpeg程序

编译好的程序:
ffmpeg:用于转码的应用程序
ffplay:用于播放的应用程序
ffprobe:查看文件格式

ffmpeg库

https://blog.csdn.net/leixiaohua1020/article/details/15811977
他写了很多很简短有用的demo,各个平台的功能。

问题

  1. RGB、YUY数据是如何从内存显示的?具体的系统调用与实现代码。

不论什么外设都是IO端口几种交互方式。DMA、俩种IO地址方式。我只是不知道具体的软件层级功能实现。