在几乎不损失画质的前提下,怎么用 ffmpeg 把 h.264 格式的视频转换成 h.265 格式的?

5 天前
 wniming

linux 平台,显卡是 uhd770 ,渲染节点是 /dev/dri/renderD128 ,输入文件的路径是 /tmp/h264.mp4 ,输出文件路径是 /tmp/hevc.mp4 ,有大佬能给个能直接用的命令吗?

转换的目的是为了减小文件的大小

3496 次点击
所在节点    FFmpeg
29 条回复
msg7086
5 天前
就算不减小文件大小,也会损失少许画质。减小文件大小的话,损失得更多一些。
如果用显卡编码的话,比纯软件编码损失会再更多一些。
thunderw
5 天前
直接丢给 AI 就会给你个能用的命令,完全不损不大可能。
wniming
5 天前
@msg7086 我在 windows 平台下用 handbrake 的 qsv 硬件加速预设转码一个 11 分钟,h.264 格式,1080p ,大概 10 兆左右码率,823 兆大小的视频, 转换后的视频大小有 488 兆,码率大概 6 到 7 兆,同时播放 2 个视频对比看不出明显的差别,我就是希望能达到这样的效果,我标题的描述不是很准确,我是想只要没有明显的画质损失就可以。
wnpllrzodiac
5 天前
V..... libx265 libx265 H.265 / HEVC (codec hevc)
V..... nvenc_hevc NVIDIA NVENC hevc encoder (codec hevc)
V..... hevc_amf AMD AMF HEVC encoder (codec hevc)
V..... hevc_nvenc NVIDIA NVENC hevc encoder (codec hevc)
V..... hevc_qsv HEVC (Intel Quick Sync Video acceleration) (codec hevc)

hevc_qsv AVOptions:
-async_depth <int> .D.V...... Internal parallelization depth, the higher the value the higher the latency. (from 1 to INT_MAX) (default 4)
-load_plugin <int> .D.V...... A user plugin to load in an internal session (from 0 to 2) (default hevc_hw)
none 0 .D.V......
hevc_sw 1 .D.V......
hevc_hw 2 .D.V......
-load_plugins <string> .D.V...... A :-separate list of hexadecimal plugin UIDs to load in an internal session (default "")
-gpu_copy <int> .D.V...... A GPU-accelerated copy between video and system memory (from 0 to 2) (default default)
default 0 .D.V......
on 1 .D.V......
off 2 .D.V......

随便搞下就行了。同样码率,265 比 264 画质高。同样画质,265 省码率。
随便给个 preset 就行。
ffmpeg -i in_h264.mp4 -c:v hevc_qsv --preset fast -b:v 2000k -movflags +faststart out_hevc.mp4
wniming
5 天前
@wnpllrzodiac 你这条命令管用,转换后的视频码率 2mbit/s 左右,大小 177MB ,看不出画质损失
ntedshen
5 天前
chesha1
4 天前
@wniming #5 它这个 fast 的 preset 太搞了,要是你不缺硬件性能建议改成 veryslow ,码率和画质的综合表现都能更好一点
234ygg
4 天前
这种很难客观评价的,变量太多了,用不同硬件同参数压出来的也不一样。。
b 站上很多 1080p 强行拉成假 4k 封装成码率 10Mbps 的 h264 ,压缩成 5Mbps 的 nvenc 1080p h265 都不会有什么画质损失。
但是有些压缩率高的惊人的 h264 ,即使转成同码率的 nvenc 1080p h265 (very slow) 也会出现画质损失。

玩多了的话,10Mbps 以下的原视频 基本上能靠肉眼先预估个实际码率,然后去调节编码的参数。。
另外,纯 cpu 软编码太慢太费电了,实在没什么必要,我只会偶尔扔一个特别值得收藏的视频蓝光 ISO 到云服务器上慢慢 cpu 软编码
wniming
4 天前
@chesha1 fast 和 veryslow 我实测文件大小和码率都没有什么区别,不过 fast 比 veryslow 快了将近一倍,不知道是不是我测试用的视频的问题。

@234ygg 我是用 uhd770 转码的,cpu 占用不高。
mongoose
4 天前
我之前也想这么做,但是经过我的调研,视频压缩转码是一个玄学,需要补课的内容有点多,我就放弃了。
cybort
4 天前
hevc 的工具应该比较多了吧,av1 的倒是不多
234ygg
4 天前
@wniming
veryslow 会在同样文件大小的前提下有更好画质,通常主观感受上连 10%都很难有,主要是高动态/比较复杂的画面会有区别。除非是特别值得珍藏起来反复观看的视频,否则没必要用 veryslow
NoOneNoBody
4 天前
@wniming #9
这个在动作片或画面高速变换的场景有区别
SenseHu
4 天前
从几个角度分析这个问题
1. 画面内容
是真实世界高频信号多的画面,还是动画那些低频信号多的,
后者优先考虑降低分辨率,对压缩贡献很大,大概率也不会影响观感, -ss 参数截一小段转码试试,
前者不太好搞, 高频信号 + 频繁运动的画面, 你眼睛跟不上他的细节, 降低点编码质量你也看不出 (前东家编解码组大佬同事的真实落地方案)
2. 码率 & 质量控制
VBR, ABR, CBR. 上面有朋友给的 -b:v 2000k 和 -crf 参数可以自己测试下看哪个好.
3. 帧比例
I 帧, P 帧, B 帧 这些概念在 h265 和 h264 都有体现, 减少低压缩率的 I 帧有利于减小最终文件大小, 对应 ffmpeg 参数
-keyint_min , -sc_threshold
4. 编码器.
要求质量的话, 优先考虑 软编( 用 CPU 编码 ), 对应 x264, x265 这些工具 ( ffmpeg -c:v 指定 ), 缺点就是慢.
这样的质量还不满意就考虑商业化方案吧, 比如 微帧 (前东家就是用的这家, 大规模用
heimoshuiyu
4 天前
想要保证画质的情况下降低大小就不要用恒定码率,用 crf 指定视频质量,不断调整直到你肉眼观察出视频质量下降就是你能接受的极限 crf 。例如手机拍摄的本身噪点就多,我一般设置 34 ,蓝光视频我一般设置 18 。不同编码器对 crf 的解释是不一样的,建议翻翻 ffmpeg 文档里面都有说得很详细。
heimoshuiyu
4 天前
另外我怀疑 OP 这个硬件编码设备的能力(同等码率下的视频质量可能会比 CPU 编码的差),除非有比较现代的独立显卡不然建议使用 CPU 压制
shimanooo
4 天前
预估码率, 比如原片的 60%, 压完以后人工比较 https://github.com/pixop/video-compare

UHD770 比 1035G7 的 GPU 老吧, 从这里看同画质压缩率不如 x265 medium. https://rigaya.github.io/vq_results/

我是用 x265 slow 的, 冬天就当取暖了.
wizardyhnr
4 天前
h264 不是高码率原盘的话就没必要转了,画质二次压缩有损。
chutsetien
4 天前
我 2 年前写的一个关于 libx265 的压码笔记,不知道 OP 会不会觉得有用:
https://www.reddit.com/r/2000committee/comments/12s5llm/some_personal_libx265_notes/
baobao1270
4 天前
不要用 gpu 转,gpu 转不保证画质,建议用 x265 cpu 编码,如果真的要对比画质那么得上 vmaf 测了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1101767

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX