风蓝办公室
发布于 2016-03-17
/
18 阅读
【日在风蓝058·技术组】来交易吧!
一、视频文件组成
1.1 封装格式
常见的影音文件格式一般为mkv、mp4等,这里的mkv、mp4实际上指的是影音文件的封装格式。封装格式对于影音文件来说相当于一个容器,这个容器里面有许多轨道,每个轨道上都有一个具体的视频文件、音频文件或是字幕文件等。
举例来说,一个mkv封装的影音文件里可能存着一个H.264编码的视频轨道,几个AAC编码的音频轨道,几个FLAC编码的音频轨道,几个字幕轨道。
不同的封装格式内能存储的具体视频编码格式和音频编码格式是不同的,mp4封装一般存储的是MPEG-4编码的视频,AAC编码的音频;而mkv封装能存储的编码格式则相当多。用封装格式来指代视频格式是相当不准确的。
1.2 视频编码格式
目前常见的视频编码格式有H.264/MPEG-4 AVC、H.265/HEVC、VP9等等,除非用于特殊的目的,一般视频都是有损压缩。一个影音文件内所封装的视频轨道的编码格式很大程度上决定了这个文件能否被正常播放,大部分移动设备都采用特殊的硬件来解码视频,PC机上的显卡也带有硬件解码的功能,如果采用这种方式来解码视频,其所支持的格式一般会限定得非常小,比如只支持H.264/MPEG-4 AVC编码标准中的一个子集。采用软件解码的话,只要播放器能正确调用相应的解码器即可。
1.3 音频编码格式
目前常见的音频编码格式有MP3、AAC、FLAC、APE等等,MP3与AAC为有损压缩,FLAC与APE则为无损压缩。高码率的AAC一般是听不出来与无损的区别的,玄学dalao们不要打我(
二、播放器组成
2.1 分离器
前面提到过,一个影音文件一般是用某种封装格式将一些具体的视频/音频/字幕等轨道封装在一起构成的,分离器的作用就是解开这个封装格式,拿到具体的视频、音频、字幕等轨道,然后让播放器去调用具体的解码器来完成解码的工作。
2.2 解码器
解码器负责将具体的视频轨道/音频轨道解码成原始视频/音频数据。
单就视频解码器来说,对于同样的一段视频轨道,正确实现的解码器解码出来的数据是一样的,从这一点上而言,软件解码与硬件解码的画质是等同的。
以前的硬件解码(DXVA)解码出的数据会直接储存在显存内然后渲染输出到屏幕上,无法再做更多的处理;而软件解码出的数据存在内存里,可以做很多后处理,比如锐化、debanding等等,渲染时的选择也更多,这也导致了一些时候软解码的画质看上去比硬解码要好。在一些支持DXVA2 copyback方式硬解码的显卡上,用这种方式硬解码可以将显卡解码出的数据拷贝回内存,这样就又可以实现一些后处理与特殊的渲染了。
2.3 渲染器
单就视频渲染器来说,渲染器负责将解码器解码出的原始视频数据渲染后送由显卡输出,其渲染过程包含颜色空间/位深的转换、对视频的缩放、颜色的校正等等处理,其每一步都可能对最终的画质产生很大的影响。
三、视频编码
3.1 基础
3.1.1 颜色空间
许多人都知道在绘画时可以使用红色、黄色和蓝色这三种原色生成不同的颜色,这些颜色就定义了一个颜色空间。我们将品红色的量定义为X 坐标轴、青色的量定义为Y坐标轴、黄色的量定义为Z坐标轴,这样就得到一个三维空间,每种可能的颜色在这个三维空间中都有唯一的一个位置。
但是,这并不是唯一的一个颜色空间。例如,当在计算机监视器上显示颜色的时候,通常使用RGB(红色、绿色、蓝色)颜色空间定义,这是另外一种生成同样颜色的方法,红色、绿色、蓝色被当作X、Y和Z坐标轴。另外一个生成同样颜色的方法是使用色相(X轴)、饱和度(Y轴)和明度(Z轴)表示,这种方法称为HSB颜色空间。另外还有许多其它的颜色空间,许多可以按照这种方法用三维(X、Y、Z)、更多或者更少维表示,但是有些根本不能用这种方法表示。
在视频编码领域,常用的颜色空间为YUV颜色空间,“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma)。
YUV发明于彩色电视与黑白电视的过渡时期,黑白信号只有Y信号,也就是灰阶值;而彩色信号则额外包含了UV作为表示色度的C信号。忽略C信号时,剩下的一个Y信号与原来的黑白电视信号相同,这样就解决了彩色电视与黑白电视的兼容问题。
由于人眼对亮度比对色度更为敏感,为了提高压缩率/减少带宽,实际使用时一般会削减色度的信号,具体做法是减少色度信号的采样点,主要的抽样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和YCbCr 4:4:4。YUV的表示法称为A:B:C表示法:
4:4:4表示完全取样。
4:2:2表示2:1的水平取样,垂直完全采样。
4:2:0表示2:1的水平取样,垂直2:1采样。
4:1:1表示4:1的水平取样,垂直完全采样。
许多常见的编码器都默认使用YV12(YCbCr 4:2:0)空间来存储视频,此时色度信号的分辨率只有亮度信号的1/4,渲染器所采用的拉伸色度信号的算法将对最终画质产生很大的影响。
以上内容部分摘自wikipedia.
3.1.2 分辨率
分辨率即视频单帧内宽高各自所含像素点数量之积,由上一章节我们知道亮度信号的分辨率跟色度信号的分辨率一般是不一样的,我们平时所讨论的分辨率如非特指,一般说的都是亮度信号的分辨率。
3.1.3 帧率
帧率即视频信号中单位时间内包含多少帧,由于视频的帧率不一定是固定的,相应地也有平均帧率,最大帧率,最小帧率等词出现。
常见的视频一般都是固定帧率的,但是有少量静态场景很多的视频采用了可变帧率的方式编码,这样更能提高最终的压缩率。
3.1.4 码率
码率即单位时间内所传输的数据位数,对于影音文件来说则是单位时间内这段文件的数据位数(大小),由于视频是有损压缩,一般其他条件相同时,码率越大所能提供的画质越好。
3.1.5 劣化
视频压缩的有损特性加上许多历史遗留问题(比如隔行扫描)等等,综合在一起造就了许多画面的劣化,有兴趣的可以看一下下面的链接:
https://bakashots.me/guide/index.php
3.2 AVS
中文文档:
https://nmm-hd.org/doc/Avisynth_2.5%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3
官方文档:
http://avisynth.nl/
3.3 x264
MeGUI只是一个壳…没有什么好说的,还是说说x264吧
介绍:
https://nmm-hd.org/doc/X264%E4%BD%BF%E7%94%A8%E4%BB%8B%E7%BB%8D
参数:
https://nmm-hd.org/doc/X264%E8%A8%AD%E5%AE%9A