其实一开始我最早写这个专栏文章是想分享一下我压制视频的方式,我用什么编码器,以及我是如何避免二压等等。但是后来就在前天我听闻b站给一些大up开放了4k,我就头一铁也投了一个4k还是HEVC编码的视频,就是这个视频,那显然我这样名不见经传的小up并没有获得4k的资格,那这个视频也被二压的很惨。

首先由于我压制的hevc视频仅有2.5mbps的平均码率,b站的二压系统就按照2.5mpbs使用AVC来给我二压了。然而我细细一看,尽管在这种非常恶劣的工况下,二压出来的画质并没有像我想象的一样那么差,甚至跟我自己使用x264压制出来的符合不被二压要求的视频比如这个视频相比,也没有差很多吧。

我就打算说不如试一试说完全让b站来压制,毕竟都2020年了,b站的编码器也在进步,而x264或者x265编码器要真正发挥它的全部性能需要非常仔细地去调参,看文档,我都没有完整地理解这两个编码器各项参数地含义。与其自己压出来还不一定很好,何不给b站地编码器提供非常高的码率的视频,然后让它来压制一份最终发表的视频呢?

所以我就做了一个画质测试,就是这个视频,以及写这篇专栏文章来随便讨论一下关于压制和画质方面的东西。这篇文章会包括我对于要不要使用b站二压的一些看法,我使用什么编码器,使用什么方式导出视频,以及刚刚提到的测试视频的一些分析。

我选取这个视频作为测试视频,这个视频本身是我剪辑的一些都市天际线的游戏画面,准备作为下一个都市天际线系列的测试片的,然后我发现这个片段里面有非常多小区块的移动,和整体的大范围移动,对于编码器来说是很恶劣的工况了,所以用来作为编码器测试挺合适。

要不要二压呢?

众所周知,在b站投稿的视频有一个非常严格的码率限制:

最大分辨率1920*1080 (当然现在对一些大up开放了4k),码率6mbps,峰值码率24mpbs的AVC(H.264)视频。这个码率在编码器设置得当的情况下其实对于大部分移动场景不多的画面来说已经完全足够,但是在快速移动场景过多的情况下还有点力不从心;不过b站允许峰值24mpbs的码率其实算弥补了这一点;但是如果不仅仅是快速移动的场景过多,而且在快速移动的场景中还包括很多小区块的移动,比如说像我这个测试视频:都市天际线视频画质测试,就需要给够很高的码率,否则视频就会出现很严重的色块或者模糊的现象。

这也是为什么我突然想着上传一些不同码率的源视频,来做一个二压/不二压的画质测试。早年的时候,各位up主其实一直都在“战二压”,通过各种手段来避免被二压,其实即便到现在,我也还是想自己压制而不被二压。

但是另一个事实其实是,现在其实b站的编码器并没有早年间那么差劲了,如果给足源视频码率进行二压,其实画质不一定比自己压制的更差;以及最重要的是,绝大多数没有大会员的网友,能看到的一定是二压过的视频。因为就算up主上传的是满足要求不被二压的视频,原视频如果满足1080p60/1080p+/720p60这三档,而只有大会员才能观看,普通会员看到的其他清晰度依然是二压过后的;而如果原视频不满足这三档,那干脆最终发表的视频就一定都是二压的版本了。

那么这样一来,如果up预先压制一个符合要求的视频,b站用于二压的源视频也就只有那个6mbps码率的视频,显然对于其它清晰度来说得到的画质不会很好。毕竟,每一次有损压缩都会对画质造成不可逆的损伤。所以其实从这个角度来说,上传一个码率足够高的视频,所有清晰度都依靠二压或许会是更好的选择。

这其实就相当于做一个选择,是给大会员观众保证看到自己压制的还不一定是最好画质的版本,还是给所有观众都看b站压制的版本,但是尽可能保证这个压制的源文件是高品质的。我觉得如果是我的话以后应该会在投稿的时候准备一个高码率视频,然后交由b站压制。这本质上和油管的模式是一样的,绝大部分视频会被使用VP9编码二压(少量会使用AVC二压)。

那自己编码用什么编码器呢?

绝大多数的b站up用的可能都是小丸工具箱,或者pr的Adobe编码器,或者某剪辑。其实就我个人认为,Adobe的编码器是比较一般的,如果能不用还是尽量不用。用过Adobe编码器的朋友可能会发现它能设置的地方其实并不是很多,以及它的编码预设其实相当于x264的fast,对于像AVC或者HEVC这类帧间编码的编码方式来说,其实越慢才能获得越好的效率;以及更多可定制的设置也可以有效地提升编码的质量,所以像Adobe编码器这样子只有有限选项并且比较重在编码速度的编码器,出品的质量并不会非常的高。换句话说,就是在相同质量的情况下,AME编码的视频码率会比调教过的x264要高;而相同码率的情况下,AME编码的质量不如经过调教的x264。

小丸其实就是ffmpeg/x264/x265这一套开源编码器的一个界面封装,而x264也是被称为最好的AVC编码器的。(很多人会误将x264写成编码方式,其实x264是编码器的名字)但是小丸内置的ffmpeg,x264和x265都是比较古早的版本了。这三个软件作为开源软件,都依然在积极更新当中,所以如果可能的话最好使用最新的版本。新版本能不能对于编码的质量和效率产生提升这个不好说,但是更新版本的编码器会在编码的性能上有所提升,通俗的来说,就是会更快。尽管我没有横向比较过上古版本的x264和最新版本的x264在编码质量上的区别,但是我还是认为有更新的版本应该使用更新的版本。

对我自己来说,我的编码都在我自己的服务器上进行,使用最新版本的ffmpeg,x264,x265以及Fraunhofer FDK AAC。我的ffmpeg是定期重新拉取最新版本的ffmpeg、x264、x265以及相关库的代码,重新编译最新版本的ffmpeg来作为编码使用。自己编译还有一个好处就是在音频编码方面可以使用Fraunhofer FDK AAC (libfdk_aac)编码器,这是一个编码质量比ffmpeg 原生aac更好的aac编码器,关于这方面这里按下不表。

这里我可以分享一个我写的在Debian系Linux下的进行拉取编译ffmpeg和相关库的脚本:

https://github.com/t-liu93/ffmpeg_process_helper/blob/master/update.sh

所以说,最终成片的编码器我只会推荐使用x264(为AVC编码)/x265(为HEVC编码)这两种。整个工具链如果要使用最新版本那自然是需要在命令行下操作了,不过这里按下不表。

我如何导出视频?

前面只说到,我使用ffmpeg的工具链作为最终成片的编码器,而从剪辑软件到最终编码器,其实中间还差好几步。以我使用的PR为例,从PR导出到使用ffmpeg编码主要有2中方式:第一种是使用帧服务器,通俗的说就是PR给ffmpeg推流一样;但是我并没有用这种方法,因为帧服务器的性能过于低下了。

第二种就是先导出一个无损文件,然后把无损文件拿给ffmpeg编码;我使用的就是这种方法,这种方法的缺点自然是会消耗很多的硬盘空间作为暂存,不过这对我来说并不是什么问题。

而就算是无损文件,也有未压缩的版本和经过无损压缩的版本,这里我用了一个叫UT Video Codec的编码器,它作为PR的插件可以让PR以UT Code导出无损压缩的AVI。下载地址在这里:https://www.videohelp.com/software/Ut-Video-Codec-Suite

说说测试视频和我用的参数

我平时常用的ffmpeg编码参数基本上就3到4个,也即是我在前面提到的这个测试视频中上传的4个不同的版本,下面来一个个说一下:

首先是为b站编码设计的预设:

这也是测试视频中p1用的预设。$FFMPEG/ffmpeg -y -i $PWD/$SRC -i $PWD/bilibiliwatermark.png  -filter_complex "overlay=0:0,format=yuv420p,scale=w=1920:h=1080:sws_flags=lanczos" -c:v libx264 -preset slow -profile:v high -level 4.2 -x264-params "keyint=480:min-keyint=1:bitrate=5850:vbv-maxrate=10000:vbv-bufsize=15000" -pass 1 -passlogfile "$HOME"/ffmpeg/ffmpeglog -an -f mp4 /dev/null

$FFMPEG/ffmpeg -y -i $PWD/$SRC -i $PWD/bilibiliwatermark.png  -filter_complex "overlay=0:0,format=yuv420p,scale=w=1920:h=1080:sws_flags=lanczos" -c:v libx264 -preset slow -profile:v high -level 4.2 -x264-params "keyint=480:min-keyint=1:bitrate=5850:vbv-maxrate=10000:vbv-bufsize=15000" -pass 2 -passlogfile "$HOME"/ffmpeg/ffmpeglog -c:a libfdk_aac -b:a 320k -ar 48000 "$SRCN"_bili6m.mp4

这边其实我就选择了slow的预设,以及强制high 4.2,使用lanczos算法进行降采样(我的视频都是4k录制),以及设定最大GOP的值,这里我设定的GOP是帧率×8(这段代码里没有因为我在这个脚本的前半部分根据帧率计算)。

然后比较重要的是vbv-maxrate和vbv-bufsize这两个,通常bufsize为maxrate的1-2倍,这边我取了1.5倍。这边我设定最大码率是10mbps,这离b站允许的24mbps还差很远;但是由于这个仅仅只是给编码器一个暗示,编码器会尽量遵守,但是也不是强制的;我经历过很多的情况就是vbv-maxrate设的太高导致峰值码率超出24mbps,我尝试很多次下来,vbv-maxrate设定在你想要的最大码率的30%-50%是一个比较好的值。因为对于b站的投稿来说,码率是很严格限定的,二次编码就必不可少了。

测试视频从这个预设转码出来的大小是149MB,平均视频码率是5838kbps,峰值码率是12746mbps

然后是我偶尔为油管投稿用的预设:

这也是测试视频中p2用的预设。$FFMPEG/ffmpeg -y -i $PWD/$SRC -i $PWD/bilibiliwatermark.png -filter_complex "overlay=0:0,format=yuv420p,scale=w=1920:h=1080:sws_flags=lanczos" -c:v libx264 -preset slow -crf 14 -maxrate 65000k -bufsize 65000k -profile:v high -x264opts "colorprim=bt709:transfer=bt709:colormatrix=bt709:keyint=30:min-keyint=15" -c:a libfdk_aac -b:a 576k -cutoff 18000 -ar 48000 "$SRCN"_crf14_65m.mp4

因为如前面所提,油管所有视频都会二压,所以对码率的要求就不那么严格。我就是用了Constant Rate Factor(CRF)模式。通俗的来说就是“质量等级”,0是无损,51是最大有损。对于x264来说,默认值是23,18可以视为肉眼无损,我这边使用了14是尽可能地多给视频分配一些码率,这里最大码率我分配在65mbps,如果是30帧及以下的视频我会给35mbps。通常我不会使用降采样功能,但是这次因为在b站投稿,我使用了一下但是不影响大局,以及还有一些色彩设置方面,这对于品质本身不会影响。

测试视频从这个预设转码出来的大小是894MB,平均视频码率是36.3Mbps,峰值视频码率是82.6Mbps,这里就可以看出,给的最大码率其实并不能很好地限制实际的最大码率。

然后是我对上一个预设稍加修改的第三个预设:

这是测试视频中p3用的预设。$FFMPEG/ffmpeg -y -i $PWD/$SRC -i $PWD/bilibiliwatermark.png -filter_complex "overlay=0:0,format=yuv420p,scale=w=1920:h=1080:sws_flags=lanczos" -c:v libx264 -preset slow -crf 14 -profile:v high -x264opts "colorprim=bt709:transfer=bt709:colormatrix=bt709:keyint=30:min-keyint=15" -c:a libfdk_aac -b:a 576k -cutoff 18000 -ar 48000 "$SRCN"_crf14_nolim.mp4

这个预设跟第二个预设只有一个区别,就是我没有加入码率限制。

对于测试视频来说,最终成片的大小是0.98GB,平均码率是41.2Mbps,峰值码率是143.2Mbps。正如我在这篇文章开始所说,这个测试视频对于编码器来说属于非常艰难那种。143.2Mbps基本上就可以说是这个视频在比较困难的时段想要保留绝大部分细节所需要的码率了。

最后还有一个HEVC的预设,这个预设一般是我存档视频用的:

这是测试视频里面p4用的预设。$FFMPEG/ffmpeg -y -i $PWD/$SRC -i $PWD/bilibiliwatermark.png -filter_complex "overlay=0:0,format=yuv420p,scale=w=1920:h=1080:sws_flags=lanczos" -c:v libx265 -crf 20 -preset medium -profile:v main10 -c:a libfdk_aac -b:a 576k -cutoff 18000 -ar 48000 "$SRCN"_x265.mp4

其实我存档时候用的预设,是不做降采样以及音频使用的是24位flac的,但是这边因为要上传b站才做了修改,但是对于视频部分没有区别。对于x265编码器来说,默认的CRF是28,相当于x264的CRF23的观感;普遍认为肉眼无损的CRF值在23,我这边选取了20,进一步增加质量,可以视作相当于x264 CRF14时候的质量。

最终成片的大小为396MB,平均码率16.4Mbps,峰值码率应该是在55Mbps上下。

测试视频的不同版本源文件的一个对比

接下来对比一下不同出片方案在困难时段时输出文件的质量。这个视频的困难时段主要是在48秒左右俯瞰工业区的部分,1分52秒第一人称的部分,以及2分42秒大范围运镜的部分。这三个时段的特征其实就是一个:很多的树木和其他类型的细小多边形,并且在快速移动。这部分就不展开了,总而言之给的码率不够那肯定不行。我都截取一下视频的第3011帧,来个简单的对比。

首先是6m版本:实时码率大约为9.5Mbps

可以看到地标、红房子和树木的细节都已经变得模糊,尤其是地标,房子的烟囱也有亿点点失圆的感觉。然后边上发电厂的发电机细节也有一些小小的丢失。

然后是crf14,65m上限的版本:实时码率63.6Mbps

这里如果注意看地标就会发现箭头的棱角更加分明。

接下来是crf14,无码率限制的版本:

实时码率123.5Mbps

这时候其实码率提升的边际效应就很明显了,跟上一张比几乎肉眼看不出什么差别。

最后是HEVC版本:

实时码率55.4Mbps

其实跟上面crf14的AVC差别不大。

当然很明显高码率保留的细节也更多,如果说要总之是要二压的话,那么显然交给编码器更多的细节总比给编码器一个已经画质一般的版本要好。

然后是b站压制的视频的一些对比

我自己觉得b站压制的版本和我自己压制的没啥区别。如果都是普通非大会员版的1080p,好像也没啥区别。我也叫了一些有氪金狗眼包括使用顶级华硕PG27UQ显示器的朋友,好像也没什么区别,所以这里就按下不表了,每个人的观感其实都不一样,所以你们也可以自己去看测试视频。

ffmpeg 分辨率 压缩_说说压制和画质的视频,以及我用的ffmpeg参数相关推荐

  1. ffmpeg 分辨率 压缩_用GPU加速FFmpeg中的超分辨率功能

    1. 简要回顾 首先简单复述一下FFmpeg中对深度学习的支持情况,如上图所示,FFmpeg在libavfilter中支持基于深度学习的filter,目前已经支持sr, derain和dnn_proc ...

  2. ffmpeg 分辨率 压缩_视频怎么在尽量不损害画质的前提下压缩?

    其实和视频画质和效果相关的参数主要是分辨率和码率以及帧率.帧率直接和画面的流畅度相关,分辨率和码率参数和画质直接相关. 帧率:指的的视频每秒钟播放的图片数目,帧率越小,那么你看到的视频就会越卡,动作就 ...

  3. ffmpeg 分辨率 压缩_Ffmpeg 视频压缩的几个关键参数

    视频压缩用到的参数主要为以下几个: 文件路径:-i 输入文件的路径 码率:-b:v 输出文件的码率 分辨率:-s 输出文件的分辨率: 帧率:-r 输出文件的帧率值 码率 码率,即波特率.值越小,转换后 ...

  4. ffmpeg 缩放算法_抖音快手短视频分屏怎么做?ffmpeg scale过滤器了解下

    原标题:抖音快手短视频分屏怎么做?ffmpeg scale过滤器了解下 引言 我们每天都在使用的抖音,快手,西瓜视频等APP,里面有为数众多的视频文件.对于这些文件,我们需要考虑各个手机厂商的品牌手机 ...

  5. 【FFmpeg】转码、压制、录屏、裁切、合并、提取、直播...(ffmpeg笔记)

    目录 01.下载,配置 02.简介,上手(FFmpeg FFprobe FFplay) 03.转换格式(文件格式,封装格式) 04.改变编码 上(编码,音频转码) 05.改变编码 中(视频压制) 06 ...

  6. ffmpeg转码_音视频处理神器FFmpeg

    下面是文字版,方便进行复制测试使用. 一  FFmpeg支持的平台 下载官方链接:http://ffmpeg.org/download.html FFmpeg的使用门槛,就是部分机器可能存在一些依赖版 ...

  7. ffmpeg h265编码_基于ffmpeg库mp4编码记录。

    要讨论的话题主要为以下: 话题1:音频流选用aac编码格式需要注意的地方. 话题2:音频流视频流同步需要注意的地方. 基本模式如下所示: 关于话题1部分,背景工作于基于海思平台35XX系列的SDK开发 ...

  8. png图片怎么压缩大小又不损失画质?

    PNG图片是目前使用最广泛的图片格式之一,它是一种采用无损压缩算法的位图格式,相对于jpg图片来说更清晰,但是PNG图片的体积kb也更大.如果PNG图片体积更大,在使用的时候就很不方便,这时候我们就需 ...

  9. java实现图片分辨率压缩、图片软化、jpg质量压缩

    最近遇见个需求,需要压缩图片,但是很多涉及到的方法类,要么对jdk依赖比较大,要么对系统的配置有要求,经过几天的研究和测试,终于整了一个还算比较全的方案. 代码 注解1:关于根据url读取图片的方法有 ...

  10. ffmpeg视频压缩速度_使用ffmpeg修改视频速度

    ffmpeg视频压缩速度 I watch a lot of sports and recently I've become fascinated with some of the methodolog ...

最新文章

  1. 6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
  2. Qt QComboBox下拉框文字重叠解决方法
  3. Dataset之谷歌地图数据集:谷歌地图数据集的简介、安装、使用方法之详细攻略
  4. Java中的Serialization
  5. EditText获取焦点并自动弹出软键盘
  6. Tree Cutting HDU - 5909
  7. jpadao层继承什么_实木复合地板特点是什么
  8. 游戏开发之继承中的构造函数、析构函数及继承中的常见问题解决方案(C++基础)
  9. Hadoop工程包架构解析
  10. lj2400恢复出厂_联想LJ2400加粉后如何清零
  11. 中国指定银行支行数据及省市数据获取
  12. Excel 对比两个表的相同列内容是否一致
  13. 《SegStereo: Exploiting Semantic Information for Disparity Estimation》
  14. vue项目报错:warning Disallow self-closing on HTML void elements (<img/>)
  15. 有没有一款软件是测试阅读准确率的,当今各一线股票软件系统指标准确率测试一览表...
  16. Xavier/Tx2镜像拷贝及系统克隆
  17. 新绝代双骄3终极全攻略6
  18. 针对严峻的网络安全环境,公司就当如何应对?
  19. 企业实施单元测试现状调查(浙江大学管理学院 李云)
  20. [历年IT笔试题]2014京东校园招聘软件开发类笔试试题

热门文章

  1. 使用宏将xlsx格式文件批量转为xls格式文件
  2. 你真的了解人工智能吗?——聊聊AI的碰壁和冬天
  3. jquery M97-datepicker日历控件
  4. 怎么用电脑录音,在电脑上录制音频的方法
  5. 如何为文件夹添加图标
  6. 【电脑自检后无法进入电脑系统的搞定妙方】
  7. 他25岁进贝尔实验室,32岁提信息论,40岁办达特茅斯会议,晚年患上阿兹海默 | 人物志...
  8. dll文件删不掉怎么办
  9. apache配置基于域名访问
  10. Frontiers of Physics中科院二区期刊,两个月内接收,无需版面费,影响因子不断上涨