FFmpeg框架的基础知识

ffmpeg是一个非常有用的命令行程序,它可以用来转码媒体文件。它是领先的多媒体框架FFmpeg的一部分,其有很多功能,比如解码、编码、转码、混流、分离、转化为流、过滤以及播放几乎所有的由人和机器创建的媒体文件。
在这个框架中包含有各种工具,每一个用于完成特定的功能。例如,ffserver能够将多媒体文件转化为用于实时广播的流,ffprobe用于分析多媒体流,ffplay可以当作一个简易的媒体播放器,ffmpeg则能够转换多媒体文件格式。

FFMPEG从功能上划分为几个模块,分别为核心工具(libutils)、媒体格式(libavformat)、编解码(libavcodec)、设备(libavdevice)和后处理(libavfilter, libswscale, libpostproc),分别负责提供公用的功能函数、实现多媒体文件的读包和写包、完成音视频的编解码、管理音视频设备的操作以及进行音视频后处理。

libavutil是一个包含简化编程功能的库,其中包括随机数生成器,数据结构,数学代码,核心多媒体工具等更多东西。
libavcodec是一个包含音频/视频解码器和编码器的库。
libavformat是一个包含了多媒体格式的分离器和混流器的库。
libavdevice是一个包含输入输出设备的库,用于捕捉和渲染很多来自常用的多媒体输入/输出软件框架的数据,包括Video4Linux,Video4Linux2,VfW和ALSA。
libavfilter是一个包含媒体过滤器的库。AVFilter可以给视音频添加各种滤镜效果。可以给视频添加水印,给YUV数据加特效。
libswscale是一个用于执行高度优化的图像缩放和颜色空间/像素格式转换操作的库。
libswresample是一个用于执行高度优化的音频重采样,重新矩阵和取样格式转换操作的库。

在视频解码前,先了解以下几个基本的概念:

编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分。
容器/多媒体文件(Container/File):没有了解视频的编解码之前,总是错误的认为平常下载的电影的文件的后缀(avi,mkv,rmvb等)就是视频的编码方式。事实上,刚才提到的几种文件的后缀
并不是视频的编码方式,只是其封装的方式。一个视频文件通常有视频数据、音频数据以及字幕等,封装的格式决定这些数据在文件中是如何的存放的,封装在一起音频、视频等数据组成的多媒体文件,也可以叫做容器(其中包含了视音频数据)。所以,只看多媒体文件的后缀名是难以知道视音频的编码方式的。
流数据 Stream,例如视频流(Video Stream),音频流(Audio Stream)。流中的数据元素被称为帧Frame。一个多媒体文件包含有多个流(视频流 video stream,音频流 audio stream,字幕等);流是一种抽象的概念,表示一连串的数据元素;
流中的数据元素称为帧Frame。

解码代码流程

(1)RGB转换成YUV

Y = 0.299R + 0.587G + 0.114B
U = 0.567(B - Y)
V = 0.713(R - Y)

值得注意的是,Y值范围为[0, 1.0]、UV值范围都是[-0.5, 0.5]

(2)YUV转换成RGB

R = Y + 1.402V
G = Y - 0.344U - 0.714V
B = Y + 1.772U

播放速度标准量的的选择一般来说有以下三种:

将视频同步到音频上,就是以音频的播放速度为基准来同步视频。视频比音频播放慢了,加快其播放速度;快了,则延迟播放。
将音频同步到视频上,就是以视频的播放速度为基准来同步音频。
将视频和音频同步外部的时钟上,选择一个外部时钟为基准,视频和音频的播放速度都以该时钟为标准。

帧速率

帧速率是每秒显示的图像数。标准影片(NTSC) 是29.97 帧第秒 (fps),电影是每秒24 帧fps。欧洲标准是(PAL) 25 帧fps。如果你对你影片的尺寸不是太注重的话,保留默认的Current选项。这将会使你制作的影片的帧速率和源文件一致。不管怎样,如果你想降低带宽和CPU的占用,你可以选择一个低的帧速率。高的帧速率拥有高的品质的,但文件尺寸也更大。

关键帧

很多编码软件使用frame differencing(帧差异)来压缩图像。帧差异其实是判断从开始帧起哪些信息发生了变化 (称为key frame关键帧)。关键帧包含了图像的所有信息。后来的帧仅包含改变了的信息。这取决于你用的编码软件,你可以指定你想要的关键帧如何出现。 如果你没有足够的关键帧,你的影片品质可能比较差,因为所有的帧从别的帧处产生。另一问题是,关键帧多了将导致影片更大,码率更高。 在一些编码软件中,当从一帧到下一帧有太多的内容发生改变时,那些增加的关键帧是自动插入的。 对于一般的用途,一个比较好的原则是每5秒设一个关键帧。

码率

通常情况下,高码率就有高的品质,但文件也会很大。在大多数情况下,你要根据你观看的影片设置码率,例如,对于384K 连接速度,你要限制码率为350-360k每秒来留一些带宽给网络传输。如果文件是下载回来后播放,那码率可以很高(高码率,然而,网速比较慢的用户将要花比较长的时间来等待播放的开始)。另外,记住在对话框中设置码率时,你要留一些空间给音频。

针对 H.264, 这里有一些常用的码率方案:

   § 画面尺寸 1920 x 1080 (真正高清), 选择码率为7,000-8,000 Kbps。

   § 画面尺寸 1280 x 720 (通用高清), 选择码率为5,000-6,000 Kbps。

   § 画面尺寸 640 x 480 (标清), 选择码率为1,000-2,000 Kbps。

   § 画面尺寸 320 x 240 (网络传输), 选择码率为300-500 Kbps。

   § 画面尺寸176 x 144 (3G), 10-15 fps的内容选择码率为50-60 Kbps, 24-30 fps 的内容选择码率为150-200 Kbps。

比特,字节和像素之间地关系

bit——计算机最小的数据单位,1比特等于1或者0,是计算机处理、存储、传输数据时使用的二进制格式;

byte——用于描述数据文件大小、磁盘或者其他存储介质空间的容量或者通过网络传输的数据量的单位,1字节相当于8比特。通常用大写的B来表示Byte;

1 kb(kilobyt)——1024比特;

1 KB(kilobyte) ——1024字节;

1 Byte = 8 bits.

一个英文字符用1个字节(byte)来表示,一个中文字符用2个字节(byte)来表示。

像素与字节没有必然联系:

比如我们设定要绘制一个32*32的正方形位图,glBitmap(32,32,x,x,x,x),后面的4个参数这里不讨论,则需要32*32个像素;

容器(Container)

  容器就是一种文件(封装)格式,比如flv、mkv、ts、mp4、rmvb、avi等。包含下面5种流以及文件头信息。

流(Stream)

  是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。

帧(Frame)  代表一幅静止的图像,分为I帧,P帧,B帧。

编解码器(Codec)

   是对视频进行压缩或者解压缩,CODEC =CODE(编码) +DECODE(解码)

复用/解复用(mux/demux)

  把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)

  把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)

码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。

 帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。

 码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。

转码流程

 FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来音视频采集、音视频格式转换,编码解码,视频截图,加水印等的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。

FFmpeg的用户有Google,Facebook,Youtube,VLC,优酷,爱奇艺,土豆,Mplayer,射手播放器,暴风影音,KMPlayer,QQ影音,格式工厂,狸窝视频转换器,暴风转码等。

FFmpeg的开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用。(在vs2010中编译不了,因为vs2010支持的是C89(不支持C99) ,ffmpeg使用的是C99,vs2013/2015可以编译)

作者:城市之光
链接:https://www.jianshu.com/p/907bfcaa9a59

猜你喜欢

转载自blog.csdn.net/qq_34623621/article/details/106204036
今日推荐