范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

音视频编解码编码参数CRF

  之前多多少少接触过一些编解码参数,CRF 参数也用过,但是最近在和朋友们聊天时,说到使用 FFMPEG 过程中碰到 CRF 参数,以及具体作用流程,这个之前一直没有跟踪过,也没有详细记录过,所以吊起了自己的好奇心,于是决定搞清楚一下,便开始了这次 CRF 的神奇之旅。CRF 简介:
  恒定速率因子(CRF,Constant Rate Factor)是一种编码模式,可以向上或向下调整文件数据速率以达到选定的质量级别,而不是特定的数据速率。
  如果要保持最佳质量,而又不怎么担心文件大小,这时候就可以使用 CRF 速率控制模式。 这是大多数情况下建议的速率控制模式。当输出文件的大小不太重要时,此方法允许编码器尝试为整个文件实现期望目标视频质量的文件输出,即所谓的一次编码便可在预期视频质量下获得最大的视频压缩效率。CRF 模式主要原理是在编码过程中通过动态调整每帧视频的 QP 值,以便可以获得保持所需视频质量水平比特率。
  但是 CRF 缺点是不能告知编码器期望获得特定大小的文件或不超过特定大小或比特率。同时需要注意的是采用 CRF 时不建议直接用来编码视频以进行流媒体传输。
  通常建议一般使用两种速率控制模式:恒定速率因子(CRF)或 2-pass ABR。 速率控制决定每个帧将使用多少位。 这将确定文件大小以及质量分配方式。CRF 实操演示
  通过 FFMPEG 二进制文件尝试用参数 CRF 进行压缩,如下图所示:
  FFMPEG 采用 CRF 分别为 18、24 进行压缩,以及和源文件的比较。
  ffmpeg -i test.mp4 -c:v libx264 -crf 18 test18.mp4
  实际转码中
  转码结束后,会显示具体的编码相关信息,包括 ref,crf 值,qp 量化步长等,以及 I 帧、P 帧、B 帧所占比重。还包含了音频相关信息如下图:
  用命令 ffmpeg -i test.mp4 -c:v libx264 -crf 24 test24.mp4,进行 CRF=24 的转码,转码结果如下图所示:
  转码后分别对三个文件进行参数查看,并形成对比,其结果如下图所示:
  上述参数只能大概了解三个视频基本信息,之后通过 Elecard eye 专业工具查看该变化产生原因的直观图,三个文件码流分析结果:
  三个文件对比情况总结如下:
  可以看出:CRF 参数的使用,I 帧数量急剧减少、同时引入 B 帧;熵编码采用了 CABAC 方式,这样压缩率就提升很多,文件大小变小。同时随着 CRF 值变大,P 帧和 B 帧压缩率也变大,文件更小。CRF 代码走读
  虽然之前走读过 FFMPEG 代码,但是具体 CRF 参数的品读还没完全注意到过。为了不是一知半解的明白该问题,还是强迫自己走一遍代码,增强印象,深刻认识,也为关心该参数的小伙伴铺垫一下基础。*•CRF 定义
  【腾讯文档】FFmpegWebRTCRTMPRTSPHLSRTP播放器-音视频流媒体高级开发-资料领取FFmpegWebRTCRTMPRTSPHLSRTP鎾斁鍣�-闊宠棰戞祦濯掍綋楂樼骇寮€鍙�-璧勬枡棰嗗彇
  首先在 X264 中可以看到该值的定义: typedef struct X264Context {     AVClass        *class;     x264_param_t    params;     ......      float crf;      ......     }
  在 AVOption 具体定义如下: static const AVOption options[] = {     { "preset",        "Set the encoding preset (cf. x264 --fullhelp)",   OFFSET(preset),        AV_OPT_TYPE_STRING, { .str = "medium" }, 0, 0, VE},     { "tune",          "Tune the encoding params (cf. x264 --fullhelp)",  OFFSET(tune),          AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE},     { "profile",       "Set profile restrictions (cf. x264 --fullhelp) ", OFFSET(profile),       AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE}, ......     {"x264opts", "x264 options", OFFSET(x264opts), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},     { "crf",           "Select the quality for constant quality mode",    OFFSET(crf),           AV_OPT_TYPE_FLOAT,  {.dbl = -1 }, -1, FLT_MAX, VE },     { "crf_max",       "In CRF mode, prevents VBV from lowering quality beyond this point.",OFFSET(crf_max), AV_OPT_TYPE_FLOAT, {.dbl = -1 }, -1, FLT_MAX, VE }, ...... }
  CRF 仍然属于 Rate control 的一中,所以可以看到其 RC 相关定义如下: #define X264_RC_CQP                  0 #define X264_RC_CRF                   1 #define X264_RC_ABR                   2
  •FFMPEG 接口梳理
  涉及到 FFMPEG 代码走读的部分太多了,在此只是简述 CRF 对应的部分,其他编解码流程大家可以根据网上其他大神的代码走读流程完成即可。此篇文章默认大家有足够基础:X264 的编解码入口符合 FFMPEG 接口定义,对应关系如下图所示:
  此处借用雷神的一张图说明:(https://blog.csdn.net/leixiaohua1020/article/details/45960409)
  X264_init()
  X264_init 函数主要作用就是将之前赋值和初始化的 option 值依次传递到 libx264 模块中,进行 X264 参数初始化,以及 RC 参数赋值。这些值是从 AVCodecContext 传递过来,以及 X264Context 的默认值。熟悉 FFMPEG 的人都了解,AVCodecContext 中包含输入命令行中编解码选项值,以及 FFMPEG 命令中包含的 option 值,而 X264Context 包含 x264 的相关选项,两者结合构成完整的 x264 编解码选项值。
  在 X264_init 的最后,进行 X264Codec 的 OPEN 动作,以及编码全局 header 的动作。
  x264_param_default
  x264_param_default 设置默认参数,包括其他的选项值,在此只关心 CRF 相关选项。x264_param_default 中将 CRF 默认开启,同时设置 CRF 选项 f_rf_constant 置为 23,这也是其他很多文章中讲到的默认值 23 的原因。
  同时注意,观察到在 x264_param_default 默认参数中 B 帧是再次设置并置位的,而且 cabac 默认开启。所以如果用 FFMPEG bin 文件进行转码出来的文件中 cabac 是默认开启的,这也是工具端查看时会出现 CABAC 以及增加 B 帧的根本原因了。
  x264_encoder_open
  在初始化具体参数后,init 函数接下来进行 x264_encoder_open(相关代码位于 encoderencoder.c)的操作,这时会具体打开到 x264 中 h264 相关编码器。
  之后在 x264_encoder_open 中主要用于打开编码器,其中校验、初始化了 libx264 编码所需要的各种变量,并完成 sps、pps、qm 初始化。 validate_parameters
  调用 validate_parameters 会进行输入参数的校验,防止输入参数异常导致编码失败。此函数中完成 CRF 相关参数校验、更新和赋值。
  其他流程部分可以参考其他大神的文章,再次不再累述。(雷神的解析非常详尽了,敬请膜拜即可x264源代码简单分析:编码器主干部分-1_雷霄骅(leixiaohua1020)的专栏-CSDN博客) x264_ratecontrol_new
  x264_encoder_open 最后会调用 x264_ratecontrol_new 完成码率控制相关变量初始化。
  x264_ratecontrol_new,主要设置码率控制的核心参数,需要对 x264 码率控制比较了解才能真正明白,否则会容易看晕。
  x264_ratecontrol_new 函数中依据传入参数是 CRF 模式,以及 b_stat_read 默认值为 0 即可将 b_abr 参数的置位为 1,同时 b_2pass 置位为 0,也就是说 CRF 模式在 rate_control 中按照 abr、非 2-pass 进行处理的。
  在 x264_ratecontrol_init_reconfigurable 函数中会进行 VBV 参数初始化,以及 CRF 相关参数 base_cplx、rate_factor_constant 的更新。
  同时 x264_ratecontrol_init_reconfigurable 中设置被调用时,传入 b_init=1 的参数,这时 CRF 置位了 VBV 模式,为后续的 rate_control 做了铺垫。
  X264_frame
  X264_frame()用于依据传入 packet 数据进行一帧视频数据的完整编码。该函数部分定义如下所示。
  reconfig_encoder
  reconfig_encoder 主要作用就是将 RC 相关的参数和 AVCodecContext 中参数进行比较,如果不一致,则重新配置编码器。比如 CRF 值初始设置为 24,但是命令行中设置为 18,这时两个值不一致,则需要按照命令行中值进行赋值并重新配置编码器,以便最终符合用户预期。具体配置大家简单看一下就好,这里不再展开。 x264_encoder_encode
  x264_encoder_encode 是真正编码的开始,在 x264_encoder_encode 这个函数里面将一帧完整 YUV 图像编码成 H264 视频流,这个过程可以参考雷神的文章,解析非常好,blog.csdn.net/leixiaohua1…
  这边关心的是 CRF 中涉及到的部分内容,在 x264_encoder_encode 中和码率控制相关的内容主要是一下接口:
  x264_thread_sync_ratecontrol():
  x264_ratecontrol_zone_init():
  x264_ratecontrol_start():开启码率控制,针对每一帧进行码率控制。在 x264_ratecontrol_start 中会根据码率控制模式的不同,选择不同的 qp 进行压缩。之前分析可知,CRF 是属于 abr 模式,同时增加了 B 帧,所以导致每帧图像的 qp 都是不同的,这样压缩后相同质量的条件下编码后文件大小就不能确定了。
  x264_ratecontrol_qp():
  码率控制是一个大块内容,设计的算法也比较复杂,该文只关注了如何将 crf 模式转换到 vbv 模式,以及对影响编码的部分参数,整个过程下一篇文章我们再进行分析和跟踪。
  以上是个人的一些看法,可能有不正确的地方,欢迎大家一起讨论学习。
  如果该文章对您有帮忙,欢迎点赞,收藏,转发、关注,在下持续更新音视频相关内容。
  作者:声网
  链接:https://juejin.cn/post/7018511880880652324

朱元璋墓600年无人敢盗,康熙见一次拜一次?其中究竟有何玄机?古人大多信奉鬼神之说,对身后事十分重视,在他们看来,死后埋葬在风水宝地,就可以保佑后世子孙,延绵不绝,繁荣昌盛。作为封建王朝的统治者,皇帝的陵墓,大多修建在传说中的龙脉所在地,不仅中国共产党人新四为说张载(10201077),字子厚,生于长安(今陕西省西安市),凤翔郿县(今陕西眉县)横渠镇人,学古力行,世称横渠先生。中国人都知道,张载先生留下了千年传颂的名言为天地立心,为生民立他是民国最大的土匪,娶了72个姨太太,晚年被七姨太一枪毙命民国时期,军阀混战,国内毫无安宁之处,而普通老百姓们为了谋生也只能自主奔波。在这样的乱世中,大部分人的选择苟且偷生,但是时局越是动荡,越会出现非凡的人,他们可能会是英雄,也可能会是风雨人生(第三十八集)妒贤忌能(2)门宗里的陈呙太娶了个媳妇名叫李晶,人长得漂亮,聪明又能干,她在娘家是生产队里的妇女队长,又是个劳动模范,学习毛著积极分子,有文化有素质,还是共产党员。嫁到我们这个偏僻的村庄后,她的李自成终是流寇,打了天下却坐不稳天下,便宜了满清初期,李自成的起义军被明军追着打,几次几乎被打的全军覆没,还曾经诈降明军过一次。崇祯七年,五省总督陈奇瑜极具军事才能,率明军将李自成张献忠等各路义军围困在车厢峡谷,而且连日阴雨,起一代名将蓝玉被朱元璋剥皮实草,后来蓝玉皮去哪了蓝玉,明朝开国名将。有胆有谋,勇敢善战,屡立战功。公元1388年,拜大将军凉国公。公元1393年,以谋反罪被朱元璋以谋反罪诛杀,剥皮实草,传示各地。究其党羽,牵连致死者达一万五千余我父亲这一生,来的干净,走得明白仅以此文追忆我的父亲我们祖籍是内蒙古土左旗善岱乡安民村,按照老人们的记载,是清朝道光年间从山西走西口来的口外。1930年夏天六月的一天,我父亲出生。这个地方,处于黄河北岸,以黄河为界,南岸是内蒙古托克历史拓展(一)1。二世而亡的朝代秦朝共存15年,原定继承人为扶苏,但因为直言犯谏,被始皇帝派到北部边境修筑长城。始皇死后,胡亥和赵高矫诏逼死扶苏,并把三十几个兄弟姐妹全部杀死。隋朝共存37年,原中国历史上传奇的七大人物袁天罡第三,诸葛亮第六,谁第一?诸葛亮神机妙算智多近妖。在风起云涌的三国时代,诸葛亮可谓是成为举世瞩目的巨星,他的种种事迹,更是让后人佩服不已,称之为神人矣。不过中华文化历史悠久,在上下五千年的历史长河当中,本事寒潮将现,养老院温度太低数十分钟后取暖器到位,城市如何做到快速感知一场寒潮来袭,城市如何快速感知?面对城市中遭受污染的河流,又该如何治理?城市,作为一个复杂的系统,承载着越来越多的人类经济社会活动,同时也面临着潜在的危机与风险。城市综合风险及隐患西热力江人缘真不错!同曦老板娘送爱马仕盲盒,网红球员给交罚款近日,关于西热力江的新闻是真不少,作为CBA联赛目前唯一的球员兼教练,西热力江为同曦男篮注入了力量和血性。但是西热力江也为自己的冲动领到了罚单,西热力江本赛季已经吃到了4次罚单,罚
豆瓣评分9。0,10本值得深读细品的断代史好书断代史,是相对于通史而言的。它是记录某一时期,或者某一朝代历史书籍。相较于通史而言,断代史能够更加聚焦这个某一时期或某个朝代的细枝末节。本期书单关键词断代史书单,分享10本值得深读蜀汉灭亡后,暴君孙皓统治下的东吴为何还能存续十七年?历史开讲黄武八年(229),孙权在武昌登基称帝,标志着东吴政权的正式建立。尽管实际上从曹魏黄初二年(221)孙权被曹丕封为大魏吴王起东吴就已经进入了独立状态,但直到孙权在既没有通过在魏忠贤得势的三年里,明朝为什么能在辽东战场把皇太极压着打?在魏忠贤得势的三年里,明朝为什么能在辽东战场把皇太极压着打?虽然这个题目可能有些夸张,但魏忠贤得势的三年里,大明王朝确实占据着总体的优势,牢牢地掌控着全局。马克思主义哲学中辩证唯物朱元璋中国历史上伟大的明朝开国皇帝朱元璋(1328年1398年),是中国历史上伟大的明朝开国皇帝。他是一个奋斗不息充满智慧的人物,经过多年的战争和斗争,最终成功夺取了中国的统治权,并确定了明朝的基础制度。他的人生经武则天之谜为何留下无字碑?武则天是中国历史上唯一的女皇帝,她在位期间对国家做出了重大贡献,被誉为扫荡天下的女子女中尧舜。然而,武则天的传奇故事中有一个谜团,那就是她留下的无字碑。为什么武则天会这样做?这引起湖北鄂州和黄冈只有一桥之隔,为何两城不合并?听听当地人的说法说到旅游,你最想去哪个城市?不仅在最近几年,而且在过去几年,中国一直在大力发展旅游业。我们可以在节假日的时候看出人流量的增长,特别是在过年国庆小长假,我们可以看出中国人真的很喜欢旅健康身体作息的最佳时间表我们体内有一种机制,可以在最恰当的时候向所有的器官发出信号,让人们知道现在是时候,应该怎么做。如果身体的生理节律受到干扰,那么你的新陈代谢将会受到影响,很容易患病。因此,要遵从法律开门红!乌鲁木齐经济技术开发区(头屯河区)春季集中签约227。86亿元人勤春来早,招商正当时。3月9日,乌鲁木齐经济技术开发区(头屯河区)举行2023年招商引资项目春季集中签约仅式,共签约23个投资项目,涵盖装备制造总部经济外资外贸金融服务等重点产业湖北鄂州梁子湖将举行半程马拉松赛事来源人民网人民网武汉3月8日电(周倩文)近日,记者从2023鄂州梁子湖半程马拉松新闻发布会上获悉,湖北鄂州梁子湖区首届半程马拉松将于2023年3月26日鸣枪开赛。据悉,2023鄂州来到海南,时间合适的话还是要去一趟三沙很多人都梦想着走遍祖国的每一寸山河大海,对于祖国最南端的城市三沙也是耳熟能详,但却不知如何才能去三沙。怀着对三沙的憧憬,却不能亲自去领略,这无疑是一大遗憾。那么,今天我就向大家介绍已杀疯!湖北地区各大汽车品牌补贴优惠政策大集合每年三月,是一年里武汉最浪漫美丽的季节。江城三月落满樱,久负盛名的武大樱花和东湖樱园吸引着众多本地及来自全国各地的游客前来游玩。不过今年这个三月,除了有前来赏樱的游客,还有一批行色