ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

x265编码实战:H.265转码参数详解与FFmpeg命令指南

x265编码实战:H.265转码参数详解与FFmpeg命令指南 1. 为什么是x265从“视频播不了”说起先讲个我朋友遇到的真实场景。他电脑里存了几十集的纪录片全是之前从流媒体平台录下来的前阵子想翻出来温习结果播放器弹了个窗口此视频需要使用高级编码功能才能播放请购买编码VIP。他跑来问我这视频是不是坏了视频没坏编码升级了。这些片源的编码格式是H.265也就是HEVC压缩效率比老一代的H.264高出一截但解码更吃性能播放器的免费解码模块没有覆盖完整于是就把“无法解码”包装成了“需要付费解锁”。这个现象这两年特别普遍不光是暴风影音很多国产播放器都在用类似的方式做会员转化。那怎么办要么换播放器要么自己动手转码。换播放器治标不治本因为H.265还分各种等级、各种编码工具集播放器支持了你未必能调参数最稳的办法是自己掌握编码工具把视频变成自己说了算的格式。这就是x265出场的时候了。x265是一个开源的H.265/HEVC视频编码器简单理解它就是把原始视频压成H.265格式的“压缩机”。市面上你能见到的H.265视频相当大一部分是用x265压出来的它也是FFmpeg里内置的libx265编码器。这篇文章不讲太过底层的算法理论而是从实操角度拆解怎么把一段视频用x265编码成H.265格式参数怎么选怎么避免“压完了反而画质变差”“压完了播放器还是播不了”这种烂坑我尽量把每一步的参数逻辑讲清楚而不是丢给你一条现成命令就完事。适合谁看手上有视频素材想压缩存储的、做短视频分发需要控制文件体积的、想弄明白H.265和H.264到底差在哪里的都可以往下看。2. 编码前的准备工具链和源视频分析2.1 装好FFmpegx265就跟着有了x265本身是一个独立的命令行程序但实际上大多数人不会直接去调它而是通过FFmpeg来调用。FFmpeg是视频处理领域的瑞士军刀解封装、解码、滤镜、编码、封装一条龙而libx265就是它内置的H.265编码实现。安装方式看你的系统Windows用户去FFmpeg官网下载Windows构建版解压后把bin目录加入系统PATH命令行就能用ffmpeg了。macOS用户brew install ffmpeg默认就带libx265。Linux用户Ubuntu/Debian下执行sudo apt install ffmpeg通常已经包含libx265支持如果源里的版本太老可以自己编译不过日常用没必要。装完以后验证一下ffmpeg -version ffmpeg -encoders | grep 265能看到libx265输出说明环境没问题。这一步卡住的人其实挺多的尤其是Windows用户解压了不知道加PATH我建议直接搜“ffmpeg windows build”BtbN那套编译版比较常用。2.2 先摸清源视频的家底编码之前最重要的一件事不是急着敲命令而是先用FFprobe看清源视频是什么情况。FFprobe是FFmpeg自带的分析工具能看到视频流、音频流、封装格式、分辨率、帧率、码率、色彩空间等一系列信息。ffprobe -v error -show_streams -show_format input.mp4或者用更精简的格式ffprobe -v error -show_entries streamindex,codec_name,codec_type,width,height,r_frame_rate,pix_fmt,duration -of defaultnoprint_wrappers1 input.mp4我习惯先看几样东西编码格式源视频是H.264、MPEG-2还是别的这决定了编码成本。分辨率与帧率分辨率好理解帧率通常就是25fps或30fps如果是60fps的源编码参数要考虑运动复杂度。像素格式常见的是yuv420p也有yuv422p、yuv444p。x265对输入像素格式有要求有时需要先转换。码率模式源视频是CBR固定码率还是VBR可变码率量级是多少可以作为设置目标的参考。我第一次用x265时从网上下了一段比较老的美剧源是480p的MPEG-2直接拿x265压压完以后画面满屏色块。后来用probe一看源视频是隔行扫描的需要先做反隔行处理。这就是不做分析的后果。2.3 硬编还是软编先搞清楚自己的需求很多人上来就问“x265编码怎么那么慢”是因为他没有意识到x265默认用的是软件编码纯靠CPU算。而市面上很多剪辑软件、压缩工具用的是硬件编码也就是显卡里面的专用编码单元NVENC、QSV、AMF这些速度快很多倍。这里我把两者的定位梳理一下维度x265软编显卡硬编压缩率高同码率下画质更好中低同码率下画质逊色编码速度慢看CPU性能极快实时甚至超实时参数控制丰富可以精细调优有限预设为主适用场景最终成片、归档存储、追求画质临时预览、直播推流、批量粗转所以如果你追求的是“在尽量小的体积下保持尽量好的画质”那就要用x265软编这也是这篇文章的核心方向。如果你只是想把一个视频从A格式变成B格式比如从MKV封装改成MP4方便手机看那硬编就够用了没必要花几小时跟软编较劲。3. 核心参数拆解CRF、preset、profile到底怎么配3.1 CRF画质和体积之间的总开关x265里最核心的质量控制参数是CRF全称Constant Rate Factor中文一般叫恒定质量因子。它的取值范围默认是0到51但这个数字的意义和很多人直觉相反CRF值越小画质越好文件体积越大CRF值越大画质越差体积越小。H.264时代CRF 23左右是“视觉无损”的惯用值H.265时代因为压缩效率更高习惯上可以把CRF往回调一档比如CRF 21到23视觉上基本看不出和原片的区别。下面这张表是我常用的一组CRF参考值基于1080p、电影类型素材CRF值视觉效果单集40分钟体积参考适用场景18-20接近无损2-4GB素材归档、精修成片21-23视觉无损1-2GB个人收藏压制24-26轻微压缩痕迹600MB-1GB日常观看、移动端28以上明显的质量下降300MB以下临时文件、不推荐这里要特别说明CRF不直接控制目标码率它是让编码器根据画面复杂度自动分配码率。画面复杂比如有大量树叶晃动、光影变化的地方多给码率画面简单比如静态字幕、纯色背景的地方少给码率。直觉上效率高、省体积。CRF在实际使用中最大的问题是你无法预知最终体积。因为体积取决于源视频的复杂度同样的CRF压一部动画片和压一部演唱会出来的体积天差地别。如果对体积有硬性要求那就得用二压或者ABR平均码率模式但日常收藏向转码CRF其实是最省心的。3.2 preset拿时间换空间的博弈x265的preset参数决定编码器的运行速度可选项从ultrafast、superfast、veryfast、faster、fast、medium、slow、slower到veryslow逐级变慢压缩率也逐级提升。简单说preset越慢同样的CRF值下体积越小、画质越好但编码时间越长。这里要澄清一个常见误解preset不是“画质开关”。它本质上是编码器的算法复杂度和搜索范围设置。preset越慢编码器在运动估计、块分割、帧间预测上做得越精细能用更少的码率表达同等画质。我的建议是日常用preset slow或者medium就够了。preset slow比medium慢不少但压缩率提升有限对1080p视频来说体积可能只差5%-10%而veryslow压一部两小时的电影可能要七八个小时这种时间成本绝大多数人承受不起。还有一个实际经验如果源视频质量本身就很差比如低码率流媒体录屏、多次转码过的老视频用veryslow也救不回来。编码器能做的只是在有限的信息里尽量保留垃圾进垃圾出。3.3 profile和level多少设备能播放由它俩说了算如果你压完的H.265视频只是为了自己电脑上看只需要注意播放器支持不支持就行。但如果要放到老电视、机顶盒、手机旧机型上播放那profile和level就得选对。H.265的profile有三个常见档次Main最常用支持8bit位深绝大多数设备都能解。Main 10支持10bit位深色彩过渡更平滑是HDR视频的基础解码要求比Main略高。Main 4:2:2 / Main 4:4:4主要面向专业制作设备兼容性很差普通场景不要用。编码时可以通过-profile:v main或-profile:v main10来指定。很多人忽略的一个概念是level它决定了解码器的处理能力上限包括分辨率、帧率、码率的组合。比如level 4.0支持1080p60fpslevel 5.1支持4K30fps。如果编码时乱设了过高的level老设备拿到视频可能直接拒播。说个真实案例我有一台旧的电视盒子H.265硬解只支持到level 4.1。我压了一部4K视频默认level给打了5.1结果电视上播不了盒子直接放弃硬解软解又卡成幻灯片。后来重新压的时候锁定-level:v 4.1电视就能正常播放了。这个参数平时不显眼但跨设备分发时非常关键。3.4 影响体积和画质的其他隐藏参数除了CRF、preset、profile这几个明面上的参数x265还有几个藏得很深但影响很大的选项。-x265-paramsx265本身有大量参数可以通过这个入口传入比如aq-mode、rd-level、psy-rd等这些属于进阶调优范围普通用户用默认值就够。--keyint关键帧间隔默认是250也就是每250帧插入一个关键帧。关键帧间隔越大压缩率越高但快进快退时要解码的帧也越多。我喜欢设成帧率的10倍比如30fps视频设300。--bframesB帧数量默认值通常够用不需要动。--color-primaries、--color-transfer、--color-space色彩元数据参数。如果源视频是鲜艳的BT.2020色彩空间但编码时用了默认的BT.709出来的画面颜色就会发灰发白。这个问题在HDR转SDR时尤其常见。我强烈建议普通用户不要一上来就堆参数先把CRF、preset、profile这三件套选对压出来的东西就已经很能打了。参数堆多了出了问题反而不知道是哪一项引起的。4. 实操过程一条命令走完H.265编码4.1 最简命令如果你只是想把一个视频文件转成H.265格式最基础的命令是这样ffmpeg -i input.mp4 -c:v libx265 -crf 23 -preset slow -c:a copy -tag:v hvc1 output.mp4这条命令干了几件事-c:v libx265视频流用x265编码。-crf 23质量设置为23适合大部分1080p素材。-preset slow压缩效率与速度的平衡点。-c:a copy音频流直接复制不重新编码避免音质损失也省时间。-tag:v hvc1这是很多人忽略的关键参数。-tag:v hvc1到底有什么用H.265视频在MP4容器中的编码器标识可能是hev1也可能是hvc1区别在于hev1意味着参数集信息存放在额外轨道里hvc1意味着参数集直接内嵌在视频流中。苹果系的设备和很多播放器只认hvc1如果你压出来的文件在iPhone、iPad上打不开或者QuickTime直接报错很可能就是没加这个tag。4.2 更完整的进阶命令实际工作中我很少直接照搬上面的命令因为源视频不总是规整的MP4。这里给一个更通用的版本说明每个环节为什么要做ffmpeg -i input.mkv \ -map 0:v:0 -map 0:a:0 \ -c:v libx265 \ -crf 22 \ -preset slow \ -profile:v main \ -x265-params keyint300:min-keyint30:bframes4:aq-mode3 \ -c:a aac -b:a 192k -ac 2 \ -tag:v hvc1 \ output.mp4-map 0:v:0 -map 0:a:0手动指定要保留的轨道。MKV文件里经常有多个视频轨比如导演评论视频轨和一堆音轨评论音轨、多语言音轨不指定的话FFmpeg默认只挑了第一个视频轨和一个音频轨且各轨位不固定。用map能精确控制你要哪个流。-profile:v main如果你确定不需要HDR、不需要10bit就用main兼容性最佳。-x265-params keyint300:min-keyint30:bframes4:aq-mode3这里面的aq-mode3是x265自适应量化模式对画面细节保留有帮助。keyint设300是让关键帧控制在10秒左右一个方便拖动进度条。-c:a aac -b:a 192k -ac 2音频重编码成AAC 192kbps双声道。如果源视频本身是AAC且你对音质要求不高也可以直接用-c:a copy但如果你源音频是DTS或AC3很多播放器解码费劲转成AAC是通吃方案。这还没完编码完成后建议顺手验证一下输出文件是否正常ffprobe -v error -show_entries streamindex,codec_name,codec_type,profile,level,pix_fmt -of defaultnoprint_wrappers1 output.mp4确认视频流编码名是hevcprofile是Main像素格式是yuv420p。4.3 批量编码脚本如果你跟我一样经常一压就是几十集剧一条一条敲命令效率太低。我会写一个简单的bash脚本把同样的参数套用到整个文件夹里的视频上。#!/bin/bash for f in *.mkv; do ffmpeg -i $f \ -map 0:v:0 -map 0:a:0 \ -c:v libx265 \ -crf 23 \ -preset slow \ -profile:v main \ -c:a aac -b:a 192k -ac 2 \ -tag:v hvc1 \ ${f%.mkv}_h265.mp4 doneWindows用户可以在PowerShell里做类似的事或者直接用批处理。批量转码前一定要先跑一集做测试确认画质、体积、声音都没问题再放到队列里批量跑。我在这上面吃过亏直接批量压了一整个季的剧压到一半发现源视频有一半是隔行扫描画质全是水波纹只好全部删掉换参数重来。4.4 编码过程中的实时监控x265编码很慢动辄几个小时起步。FFmpeg在编码时会在终端里输出实时进度但如果开了多行输出被刷屏就看不到完整信息。我喜欢用-stats_period参数控制输出频率或者干脆重定向到日志文件ffmpeg -i input.mkv ... -progress pipe:1 2 encode.log日志里记录了每一帧的编码状态。如果你发现某一帧耗时异常长说明这一帧画面复杂度非常高编码器在拼命做运动搜索属于正常现象。如果整体速度低于0.5x说明你的CPU确实是扛不住这个preset可以重启进程改用faster。5. 常见问题与排查实录5.1 播放器提示需要购买编码VIP或者视频播不了这就是文章开头说的那个问题。x265编码出来的视频在部分播放器里不能正常播放可能是因为三种情况第一播放器根本不支持H.265硬解特别是老版本或精简版播放器遇到HEVC就直接弹窗收费。这种情况要么换个播放器要么把视频转成H.264。第二视频编码信息不标准比如profile是Main 10但播放器只支持Main。第三封装tag的问题没有加-tag:v hvc1导致识别失败。我的建议是如果视频是给别人看的先问清楚对方的播放环境。如果不确定压成H.264更稳妥但如果对方是常见的主流播放器如PotPlayer、VLC、IINAH.265基本都能搞定。5.2 编码后画面出现色块、噪点、涂抹感这是CRF设得过大导致的高频细节丢失或者码率分配不合理。最常见的场景是夜景视频画面大部分是纯黑背景但某个角落有灯光招牌编码器觉得黑色区域不需要码率就把大量码率集中在招牌上结果暗部出现大面积色块。解决办法有几个方向降低CRF值比如从26降到22开启aq-mode让码率分配更平均或者用--no-sao关闭样点自适应偏移有时能减轻涂抹感。这里我单独说一句x265编码前会做降噪预处理如果你源视频本身噪点很多x265会把噪点当成画面细节保留下来导致体积剧增。这种情况下可以先给视频做一个轻度降噪滤镜比如hqdn3d编码效率会好很多。5.3 编码后体积反而变大正常情况下H.265的压缩率应该比H.264高30%-50%如果压完体积反而更大一般是以下原因源视频码率极低甚至本来就是H.265转成的低质文件x265再怎么压也无从下手。CRF设得太小比如设了16以下编码器几乎在做无损压缩体积当然大。源视频分辨率很高比如4K但你没有设置合理的预设和CRF导致码率用不完。我遇到最离谱的一次是一个原来只有200MB的480p视频用x265默认参数压完变成400MB。后来查了源视频码率才800kbps但我把CRF设成了18编码器为了追求“高质量”疯狂堆码率体积自然翻倍。所以低质量源视频不要用太低的CRF。5.4 编码速度极慢甚至CPU占用到100%x265软编本来就是慢工出细活但如果你压一个720p视频也要四五个小时那就需要检查了。检查点有三处preset是不是设成了veryslow电脑是否有多个视频同时编码导致资源争抢电源是否省电模式CPU频率被锁了。我只提醒一句x265的单线程效率其实不算高多核并行效果很好但如果你用的是双核老CPU老老实实把preset调到fast甚至faster不要跟性能较劲。5.5 压好的视频上传到平台后被二次压缩自媒体时代很多人的视频最终要上传到抖音、B站、视频号这些平台。这些平台收到视频后会做自己的转码处理你压出来的H.265视频被平台重新编码体积优势荡然无存而且可能会因为两次编码产生画质下降。我的建议是给平台的视频不要用x265直接用H.264高码率输出x265适合的场景是个人存储、备份、局域网传输。这也回到一个更本质的问题编码器的选择取决于视频的最终流向而不是一味追求体积小。6. 个人经验什么片子适合H.265什么不适合6.1 适合转成H.265的视频以我自己实际压过的素材为例最适合转成H.265的有三类第一类长时间录制的会议、讲座、课程视频。这类视频画面相对静态H.265的高效帧间压缩优势非常明显同样的CRF下体积只有H.264的一半甚至更低。第二类自己用手机、相机拍的旅行素材。原始素材是4K 10bit HDR一张卡放不了多少东西转成H.265 Main 10之后体积能小一半以上画质肉眼看不出差别。第三类老电影、老电视剧的收藏。这类内容是固定机位拍摄画面变化较少H.265能压得更小而且老片的噪点可以通过合理参数做保留或削减。6.2 不适合转成H.265的视频直播录像、屏幕录制这类视频画面里大量文字和锐利边缘H.265会用更大的块尺寸做预测这种内容的编码效率提升不明显反而可能因为文字边缘振铃效应导致观感下降。另外如果你要频繁剪辑视频尽量不要把所有素材都压成H.265。H.265的解码开销比H.264大很多剪辑软件在拖动时间线、预览片段时会更卡。剪辑过程中用代理文件最终输出才统一转H.265这才是合理的流程。6.3 双编码和保留副本的取舍很多人问我要不要把原始素材删掉只留H.265压缩版我的答案是取决于你的存储压力和素材价值。我个人的习惯是重要的素材保留原始文件压缩版只作为日常观看和分享用。因为H.265编码虽然是“视觉无损”但多次转码后细节总会丢失。如果哪天你想重新剪辑从压缩版再导出画质损失是叠加的。如果存储空间实在紧张退而求其次保留原始素材的flac级备份用无损压缩然后把中间过程文件删掉。转码过程中产生的临时文件是第一个要清理的。7. 一点心得参数不是越多越好我把这篇文章里涉及的核心参数归纳成一张速查表方便你直接抄参数推荐值说明CRF22-231080p日常观看presetmedium到slow平衡速度与压缩率profilemain / main10无HDR需求用maintaghvc1苹果设备和QuickTime必需keyint帧率的10倍方便快进快退audioaac 192k通用性最强但更重要的是理解参数之间的相互关系。CRF决定画质基准preset决定编码器在这个基准上能跑多深profile和level决定视频能被多少设备解码。这四个参数就是x265压片的“四梁八柱”把它们调明白剩下的一切都是锦上添花。我在实际使用中有个体会很多人压完视频第一件事是把两个视频放在一起逐帧对比找差别。这个习惯是好的但要注意对比方法——不要放大到400%去找细节差异那种差异几乎任何压缩都会引入。正确的做法是在正常观看距离和正常屏幕尺寸上比较如果看不出差异这个参数就是合适的。最后再分享一个小技巧。如果你压完的视频是用在户外大屏或者展示场景建议压完以后用ffplay检查一下运动场景下的流畅度静态帧画质好不代表播放时没有撕裂和卡顿。参数调得再漂亮最终输出去哪里直接决定了你的编码策略。
返回列表