找回密码
 立即注册
搜索
查看: 16149|回复: 99

[硬件] ffmpeg用av1编码器压片,交流下压片设置

[复制链接]
     
发表于 2024-6-17 14:50 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 普通论坛用户 于 2024-7-23 13:59 编辑

用的svt-av1,它在视频质量、低比特率和编码速度达成较佳的平衡,感谢楼下的推荐

真人视频,比如电视剧、电影等
  1. ffmpeg -i input.mp4 -c:a copy -c:v libsvtav1 -preset 4 -crf 35 -pix_fmt yuv420p10le -svtav1-params tune=2:lp=12:film-grain=8:enable-variance-boost=1:variance-boost-strength=2 output.mp4
复制代码
如果是恐怖片、低对比度或高对比度的电影,-svtav1-params​参数可以设variance-boost-strength=3

2D视频(手绘2Dshi
  1. ffmpeg -i input.mp4 -c:a copy -c:v libsvtav1 -preset 4 -crf 50 -g 100 -pix_fmt yuv420p10le -svtav1-params tune=2:lp=12:film-grain=4:enable-variance-boost=1:variance-boost-strength=2 output.mp4
复制代码

3D视频大概不需要方差提升细节,可删enable-variance-boost=1​取消提升细节,3D没有胶片颗粒感,可删film-grain=4​
  1. ffmpeg -i input.mp4 -c:a copy -c:v libsvtav1 -preset 4 -crf 45 -g 100 -pix_fmt yuv420p10le -svtav1-params tune=2:lp=12 output.mp4
复制代码


有啥好的压片设置交流下,https://gitlab.com/AOMediaCodec/ ... /Docs/Parameters.md 参数是挺多的,不知道这些参数在压缩视频的表现性哪个更好些

python写了简单脚本,可看不看

脚本主要功能:
  • 当前目录包括子目录,批量转码视频至AV1
  • 编码成功的原片移至回收站,保留编码失败的原片
  • 跳过AV1、VP9、HEVC已编码文件
  • 中断后记编码过的视频,续编时不重码
  • 任务完成或ctrl+c手动中断,清理日志、ab-av1采样等杂项文件
  • 遇到未知视频流就去掉
  • -1073741819之类的错误重试编码,其它错误报告看着办


若要保留原文件,106行的send2trash.send2trash(old_file)注释掉,但VMAF分数94,压制过的视频和原片画质没啥差别了

依赖ffprobe、ab-av1、ffmpeg工具实现,用闲置的PC跑脚本,用的单线程(因为一个ffmpeg进程就占用90%以上,做啥别的都卡,如果不想电脑卡顿,可加--svt lp=xx参数,xx为CPU核心的三分之一),av1预设设为8

环境:
pip install send2trash

工具:
https://github.com/alexheretic/ab-av1/releases
https://github.com/GyanD/codexffmpeg/releases  (full版本,share版本皆可)

资源管理器的视频目录空白处shift+右键选择powershell或cmd,就省了cd写路径的功夫,执行下面创建的py文件:
  1. C:\Users\Administrator>pip install send2trash
  2. C:\Users\Administrator>cd /d "D:\视频目录"
  3. D:\视频目录>python "D:\av1.py"
复制代码



av1.py:

代码:
  1. # -*- coding=utf-8
  2. import datetime
  3. import logging
  4. import subprocess
  5. import sys
  6. from io import TextIOWrapper
  7. from re import search, findall

  8. import os
  9. from typing import TextIO

  10. import send2trash

  11. # 配置日志
  12. logging.basicConfig(filename='error_log.txt', filemode='a', format='%(asctime)s - %(levelname)s - %(message)s',
  13.                     datefmt='%Y-%m-%d %H:%M:%S', level=logging.ERROR)


  14. def is_video(filename: str, skip=False) -> bool:
  15.     """
  16.     判断文件是否为视频文件,True为视频文件,False为非视频文件
  17.     :param skip: bool 跳过av1、hevc、vp9编码器的视频文件
  18.     :param filename: str 文件路径
  19.     :return: bool
  20.     """
  21.     try:
  22.         cmd = subprocess.run(
  23.             rf'ffprobe -show_streams "{filename}"',
  24.             shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, encoding='utf-8')
  25.         if skip:
  26.             # 跳过特定的动图格式
  27.             unalloyed_bool = any(filename.lower().endswith(suffix) for suffix in ['.swf', '.apng', '.gif'])
  28.             # 跳过已压缩的某些编码器
  29.             if search('\ncodec_name=(av1|hevc|vp9)\n', cmd.stdout) or unalloyed_bool:
  30.                 return False
  31.         # 跳过字幕文件格式
  32.         unalloyed_bool = any(filename.lower().endswith(suffix) for suffix in
  33.                              ['.srt', '.ass', '.ssa', '.vtt', '.lrc', '.cc', '.utf', '.txt', '.qly', '.ksc', '.a16'])
  34.         if unalloyed_bool:
  35.             return False
  36.         # 判断依据是视频流信息是否包含视频文件的时长
  37.         video_search = search('\nduration=(\\d+\\.\\d+)', cmd.stdout)
  38.         # 判断依据是视频文件的后缀名,一些动图或swf不压缩
  39.         if video_search:
  40.             # 视频长度至少0.1秒,说明是视频文件
  41.             if float(video_search.group(1)) > 0.1:
  42.                 return True
  43.         if search('\ncodec_name=(vp8|vp9)\n', cmd.stdout):
  44.             # vp8没有duration信息,但可以判断是否为视频文件
  45.             return True
  46.         logging.info(f'{filename}是未知的编码器')
  47.         return False
  48.     except:
  49.         # 报错,说明文件不是视频文件
  50.         return False

  51. def check_files(file: TextIO, file_path: str):
  52.     """
  53.     检查文件是否已经存在于skip.txt中,用于跳过编码失败的视频
  54.     :param file:
  55.     :param file_path:
  56.     :return:
  57.     """
  58.     file.seek(0)
  59.     for line in file.readlines():
  60.         if file_path == line[:-1]:
  61.             return True
  62.     return False

  63. def del_logging():
  64.     # 检查日志文件是否为空,如果为空则删除
  65.     log_file_path = 'error_log.txt'
  66.     logging.shutdown()
  67.     if os.path.exists(log_file_path):
  68.         if os.path.getsize(log_file_path) == 0:
  69.             os.remove(log_file_path)
  70.     # 删除ab-av1残留的视频文件夹
  71.     for dir_path in os.listdir(os.getcwd()):
  72.         if dir_path.startswith('.ab-av1-'):
  73.             send2trash.send2trash(dir_path)

  74. def video_compress(directory, settings: int = 0):
  75.     """
  76.     对目录下所有视频文件进行压缩,使用SVT-AV1压缩
  77.     :param directory:
  78.     :param settings: 额外参数, 0: 普通视频(3D/2D/真人等普通视频), 1: 2D动画, 2: 2D老动画, 3: 真人视频, 4: 快速编码
  79.     :return:
  80.     """

  81.     # 一些自定义的压缩参数
  82.     some_cmd = {
  83.         0: '--preset 5 --svt tune=0 --min-vmaf 94',
  84.         1: '--preset 5 --svt tune=0 --svt film-grain=4 --min-vmaf 94',
  85.         2: '--preset 5 --svt tune=0 --svt film-grain=6 --max-crf 60 --min-crf 5 --min-vmaf 94',
  86.         3: '--preset 5 --svt tune=0 --svt film-grain=8 --max-crf 60 --min-crf 5 --min-vmaf 94',
  87.         4: '--preset 10 --svt tune=0'
  88.     }
  89.     etc = some_cmd[settings]

  90.     def execute_cmd(cmd):
  91.         subprocess.run(
  92.             cmd,
  93.             shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,
  94.             encoding='utf-8')
  95.         print(f'{str(datetime.datetime.now())[:-7]} 压缩完成')
  96.         send2trash.send2trash(old_file)

  97.     # 创建txt文件写入编码失败的视频,确保下次编码跳过该文件
  98.     skip_txt = open('skip.txt', 'a+',encoding='utf-8')

  99.     for foldername, subfolders, filenames in os.walk(directory):
  100.         for filename in filenames:
  101.             old_file = os.path.join(foldername, filename)
  102.             if not check_files(skip_txt, old_file):
  103.                 # 通过cmd执行命令

  104.                 cmd = f'ab-av1 auto-encode -i "{old_file}" {etc}'
  105.                 try:
  106.                     if is_video(old_file, skip=True):
  107.                         print(f'{str(datetime.datetime.now())[:-7]} 命令{settings} 正在压缩 {old_file}')
  108.                         execute_cmd(cmd)
  109.                 except KeyboardInterrupt:
  110.                     # 手动中断
  111.                     print(f'{str(datetime.datetime.now())[:-7]} 压缩任务被中断,正在清理残留文件中……')
  112.                     del_logging()
  113.                     sys.exit()
  114.                 except subprocess.CalledProcessError as e:
  115.                     # 如果命令执行出错,记录错误信息
  116.                     error_msg = e.stderr
  117.                     if 'Error: Failed to find a suitable crf' in error_msg:
  118.                         # 找不到合适的crf值
  119.                         print(f'{str(datetime.datetime.now())[:-7]} 压缩失败,原因:未能找到合适的crf值')
  120.                     elif t := search('\'(.*?)\' is not recognized as an internal or external command', error_msg):
  121.                         # ab-av1.exe执行路径未添加到环境变量
  122.                         print(
  123.                             f'{str(datetime.datetime.now())[:-7]} 找不到{t.group(1)},可能是你没有下载该程序或{t.group(1)}的所在路径未添加到环境变量')
  124.                         del_logging()
  125.                         sys.exit()
  126.                     elif 'Error: ffmpeg vmaf exit code -1073741819' in error_msg:
  127.                         # 内存泄漏,尝试重新编码
  128.                         try:
  129.                             execute_cmd(cmd)
  130.                         except:
  131.                             logging.error(
  132.                                 f"{'-' * 100}\n命令:{cmd}\n重新编码失败,可能是其它错误: {old_file}\n{error_msg}\n{'-' * 100}\n\n原先错误报告:{error_msg}")
  133.                             print(
  134.                                 f"{str(datetime.datetime.now())[:-7]} 也许发生了内存泄漏,重新编码失败,可能是其它错误,具体错误参见error_log.txt")
  135.                     elif 'Error: ffmpeg encode exit code -22' in error_msg:
  136.                         # 编码失败,尝试跳过未知视频流
  137.                         stream_index = findall('Could not find tag for codec none in stream #(\\d+)', error_msg)
  138.                         try:
  139.                             if stream_index.__len__() > 0:
  140.                                 print('跳过未知视频流,正在重新编码中……')
  141.                                 for index in stream_index:
  142.                                     cmd += f' --enc map=-0:{index}'
  143.                                 execute_cmd(cmd)
  144.                             else:
  145.                                 raise Exception()
  146.                         except:
  147.                             logging.error(
  148.                                 f"{'-' * 100}\n命令:{cmd}\n找不到视频流,可能是其它错误: {old_file}\n{error_msg}\n{'-' * 100}\n\n原先错误报告:{error_msg}")
  149.                             print(
  150.                                 f"{str(datetime.datetime.now())[:-7]} 找不到视频流,可能是其它错误,具体错误参见error_log.txt")
  151.                     elif r'''error: a value is required for '--svt <SVT_ARGS>' but none was supplied''' in error_msg:
  152.                         # SVT参数值异常
  153.                         print("发生了SVT参数值异常,请检查编码指令是否正确")
  154.                         sys.exit()
  155.                     else:
  156.                         logging.error(f"{'-' * 100}\n命令:{cmd}\n压缩视频出错: {old_file}\n{error_msg}\n{'-' * 100}")
  157.                         print(f"{str(datetime.datetime.now())[:-7]} 压缩视频发生了错误,具体错误参见error_log.txt")
  158.                 skip_txt.write(f'{old_file}\n')

  159.     # 关闭文件对象
  160.     skip_txt.close()



  161. if __name__ == '__main__':
  162.     # 0: 普通视频(3D/2D/真人等普通视频), 1: 2D动画, 2: 2D老动画, 3: 真人视频, 4: 快速编码
  163.     video_compress(os.getcwd(), 1)

  164.     # 清理残留文件
  165.     os.remove('skip.txt')
  166.     del_logging()
复制代码



建议上好一点的水冷或超大号风冷,我发现编码过程中电脑频繁死机,鼠标、键盘操作无反应,CPU停止工作(包括CPU风扇也停止工作),显示器只能显示CPU风扇异常关闭前的最后一帧,我猜可能是CPU长时间保持99%,设备过热触发温度警戒线强制关闭CPU

水冷和风冷不要吝啬金钱,最好上千块,一分钱一分货

如果没钱,就加入额外参数lp=1~4,保持CPU 30~50%占用率使其不过热,代价是降低编码速度

ab-av1的参数是--svt lp=xxx



回复

使用道具 举报

     
发表于 2024-6-17 17:23 来自手机 | 显示全部楼层
虽然不知道死机是怎么回事,但现在想要压av1建议尝试SVT-AV1,这两年发展得很好,画质不输libaom,与此同时速度快了很多。对于4k视频来说av1应该不会比hevc有明显优势(都使用软编码的情况下),所以如果你已经习惯了用hevc那就继续用呗。av1有优势的场景是高噪点的视频和极低码率,如果码率都到18000kbps了那说实话不管用啥应该都看不出区别。
回复

使用道具 举报

发表于 2024-6-17 17:51 来自手机 | 显示全部楼层
本帖最后由 posthoc 于 2024-6-17 17:56 编辑

效率是空间效率还是时间效率?我的体验是h265使用x265软件编码同质量下比硬件编码体积明显更小,就是速度慢不少。
回复

使用道具 举报

     
 楼主| 发表于 2024-6-17 18:32 | 显示全部楼层
本帖最后由 普通论坛用户 于 2024-6-17 18:37 编辑

风怒编辑
回复

使用道具 举报

     
 楼主| 发表于 2024-6-17 18:33 | 显示全部楼层
本帖最后由 普通论坛用户 于 2024-7-4 00:32 编辑
zhguyu 发表于 2024-6-17 17:23
虽然不知道死机是怎么回事,但现在想要压av1建议尝试SVT-AV1,这两年发展得很好,画质不输libaom,与此同时 ...

查阅了https://trac.ffmpeg.org/wiki/Encode/AV1 ,尝试使用命令"ffmpeg -help encoder=libsvtav1",却收到编码器未找到的反馈。我原本使用的是从gyan.dev构建的FFmpeg版本。为解决此问题,现已下载并替换成BtbN构建的FFmpeg版本:https://github.com/BtbN/FFmpeg-Builds/releases

这一版本的编码速度相较于普通的AV1编码器显著提升,运行效率提高了好几百倍……原先的AV1编码效率是0.0001~0.0008……

编辑:

之前下的是青春版gyan.dev,下Full或Share版本就可以了,BtbN下的已删
回复

使用道具 举报

     
 楼主| 发表于 2024-6-17 18:37 | 显示全部楼层
posthoc 发表于 2024-6-17 17:51
效率是空间效率还是时间效率?我的体验是h265使用x265软件编码同质量下比硬件编码体积明显更小,就是速度慢 ...

软解太慢了

有3T多的视频,数量成千上万,如果都用软解那得编码到天荒地老

有时间的话,自然就软解了
回复

使用道具 举报

     
发表于 2024-6-17 18:46 来自手机 | 显示全部楼层
普通论坛用户 发表于 2024-6-17 18:37
软解太慢了

有3T多的视频,数量成千上万,如果都用软解那得编码到天荒地老

无论是libaom还是svtav1都是软件编码,只是10代i5有点不够用了。你需要做的是把这3T的视频进行筛选,如果原本就是hevc/av1编码的那不建议再次压制,只会带来细节损失。如果是h264的那就可以再压一遍以节省体积。
回复

使用道具 举报

发表于 2024-6-17 18:57 | 显示全部楼层
你两个都不支持硬件编码吧,纯软编码
回复

使用道具 举报

     
 楼主| 发表于 2024-6-17 19:01 | 显示全部楼层
zhguyu 发表于 2024-6-17 18:46
无论是libaom还是svtav1都是软件编码,只是10代i5有点不够用了。你需要做的是把这3T的视频进行筛选,如果 ...

当然是上python多线程异步运行shell,根据ffmpeg检查视频元数据,采取不同的压片措施

hevc/av1编码是否压制,看它压制质量如何了,如果质量太大尝试用 SVT-AV1压制,如果压制后还没原片小就删掉
回复

使用道具 举报

     
发表于 2024-6-17 20:00 | 显示全部楼层
既然这么大量视频压制买块Intel显卡不是更好
回复

使用道具 举报

     
发表于 2024-6-17 20:08 来自手机 | 显示全部楼层
qazesz 发表于 2024-6-17 20:00
既然这么大量视频压制买块Intel显卡不是更好

很明显楼主就是要CPU压,而不是显卡
回复

使用道具 举报

     
发表于 2024-6-17 20:09 来自手机 | 显示全部楼层
CPU软压av1有个优势就是速度快,不比显卡慢太多,不像x265速度一坨屎
回复

使用道具 举报

     
发表于 2024-6-17 20:09 来自手机 | 显示全部楼层
本帖最后由 蒜灵 于 2024-6-17 20:12 编辑

风怒编辑
回复

使用道具 举报

头像被屏蔽
     
发表于 2024-6-17 20:50 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
发表于 2024-6-17 20:58 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2024-6-17 20:59 | 显示全部楼层
蒜灵 发表于 2024-6-17 20:09
CPU软压av1有个优势就是速度快,不比显卡慢太多,不像x265速度一坨屎

x265花时间调校一下的话速度也是可以的,但是没法做到开箱即用这点对新人很不友好。而且目前来看无论SVT-AV1还是vvenc相比于x265在速度和质量上都是完全上位替代,就等硬解普及了。
回复

使用道具 举报

     
发表于 2024-6-17 21:46 | 显示全部楼层
蒜灵 发表于 2024-6-17 20:08
很明显楼主就是要CPU压,而不是显卡

楼主明明说了想用硬件加速,只是30显卡不支持
回复

使用道具 举报

     
 楼主| 发表于 2024-6-18 17:26 | 显示全部楼层
@循此苦旅 @zhguyu @蒜灵 ffmpeg压片指令交流一下?

文档https://gitlab.com/AOMediaCodec/SVT-AV1 提供的常见参数指南https://gitlab.com/AOMediaCodec/ ... most-common-options

写了指令:

真人视频,例如电视剧、电影等
  1. ffmpeg -i input.mp4 -c:a copy -c:v libsvtav1 -preset 4 -crf 35 -pix_fmt yuv420p10le -svtav1-params tune=2:lp=12:film-grain=8:enable-variance-boost=1 output.mkv
复制代码
2D/3D
  1. ffmpeg -i input.mp4 -c:a copy -c:v libsvtav1 -preset 4 -crf 50 -pix_fmt yuv420p10le -svtav1-params tune=2:lp=12:film-grain=4:enable-variance-boost=1 output.mkv
复制代码
3D一般没有胶片颗粒感,可能不太需要方差来提升
  1. ffmpeg -i input.mp4 -c:a copy -c:v libsvtav1 -preset 4 -crf 45 -pix_fmt yuv420p10le -svtav1-params tune=2:lp=12 output.mkv
复制代码



根据SVT-AV1文档调的参数


-c:v libsvtav1 指令调用了svt-av1编码器

-preset 4在平衡视频质量和编码速度方面表现良好。若追求极致画质,可将-preset设为0,但需牺牲大量编码时间,600MB,90秒的视频,H264编码,3840p(4k)分辨率,昨天硬是拖到今天2点才完成,编码了13小时……测了下,-preset 0文件体积和-preset 4相差不大,都是30MB浮动

-crf参数,视频的细节损失质量,数值越大意味着更低的画质与更小的文件体积,文档提到,2D/3D动画推荐设定在45以上,真人视频为35左右

tune=2 (0 = VQ, 1 = PSNR, 2 = SSIM)选SSIM算法,据说比VQ更能提供高质量视觉信息

film-grain=4(0~50)参数则根据视频类型及期望的颗粒感进行调整,具体原理参见文档

lp=12 (取决于电脑芯片的核心数量)win右键选择设备管理器,点处理器,有几个处理器就表示有几个核心数量

enable-variance-boost=1(0,默认关闭,1开启) 启用方差增强功能,提升视频细节表现力,它默认variance-boost-strength值为2(1~4)



老旧动画电影,原分辨率800*600,时长1小时56分钟,文件大小1.62GB。使用2D/3D压片设置进行压缩后,文件体积减小至271MB,而人眼几乎无法察觉到细节损失

回复

使用道具 举报

     
发表于 2024-6-19 07:37 | 显示全部楼层
呃,rav1e还是算了吧,前几年雄心勃勃地说要做新时代的x264,结果没过多久开发者就失去兴趣了,现在基本已经是个dead project了。
我av1用的不多,没法给出建议。说真的,字幕组用av1传动画且不论,我自己对于用av1以归档为目的压视频是持保留态度的,一是在高码率下不比hevc有优势,二是未来的支持存疑,毕竟vvc已经出了。我能想到的av1的优势,一是高噪点的保留,得益于film grain synthesis,二是速度比x265快?大概吧。
不过我倒是可以说说如果用x265的话大概怎样会得到一个兼顾速度与质量的结果。
首先是--crf 18 --preset slower
激进点说,对于x265来说任何低于slower的preset都是没有意义的,因为从slower开始才会启用所有的hevc特性(的快速版本),比如rect和amp。如果对于楼主来说slower就已经慢到无法接受了的话,那确实可以直接放弃hevc这个选项了。
在此基础上,--ctu 32 --rskip 2 --rskip-edge-threshold 2
这三条参数加在一起大概能在几乎不损失画质的前提下让速度翻一倍,虽然说--ctu 32可能对于4k视频来说会一定程度上降低压缩率,但是用它主要是为了规避x265的一个bug(https://bitbucket.org/multicorew ... mit-tu-0-and-ctu-64)。具体有多大的影响取决于视频的内容,可以通过--csv-log-level 2来看到每帧里CTU尺寸的分布,如果64x64的CTU比例很高的话,那--ctu 32就会带来明显的压缩率损失。
除此之外,像--no-sao或者--selective-sao 2之类的参数就看个人喜好了。

我的建议是,如果楼主试了上面的参数组合,觉得速度可以接受的话,那我还是建议用x265。如果接受不了的话那av1就是比较好的选择。

顺带一提,如果是动画的话,那--aq-mode 4和--tskip --tskip-fast的组合能带来非常好的效果,能大幅提高压缩率的同时保持画质。说到底,动画几乎可以算是最好压的视频种类之一了。x265最不擅长的是高噪点视频,想要压出好的效果简直是噩梦。
回复

使用道具 举报

     
发表于 2024-6-19 13:27 来自手机 | 显示全部楼层
有没有最新的av1和x265压制质量和性能对比?
回复

使用道具 举报

     
 楼主| 发表于 2024-6-22 17:37 | 显示全部楼层
本帖最后由 普通论坛用户 于 2024-6-23 14:41 编辑
zhguyu 发表于 2024-6-19 07:37
呃,rav1e还是算了吧,前几年雄心勃勃地说要做新时代的x264,结果没过多久开发者就失去兴趣了,现在基本已 ...

昨天光顾着av1an,踩了一些坑,最后发觉ab-av1更省事

ab-av1评估工具根据VMAF分数提供指定的画质分数进行编码,若评估结果不通过则不进行编码,让那些H265、VP9、AV1参数调的不是那么好的视频进行重新编码

ab-av1默认规则:视频VAMF得分95以上,文件体积正好小于或等于80%就重新编码

原本要python写的,这下用bat就足矣了,无需给成千上万的视频文件进行人工视觉质量评估再决定crf值(传统做法是压一遍看看crf设的值是否恰当,人工视觉评估)
一行代码解决批量转换某个目录包括子目录下的所有视频文件
  1. set "video_extensions=mp4,mkv,webm,avi,mov,flv,wmv,mpg,mpeg,3gp,ogv,divx,m4v,rmvb" && for %e in (%video_extensions%) do (for /r %f in (*.%e) do (ab-av1 auto-encode -i "%f" --preset 4 --svt tune=0 --svt film-grain=8 --svt film-grain-denoise=0 --pix-format yuv420p10le --min-vmaf 95 --max-crf 60 --min-crf 18))
复制代码

VAMF通常95分以上和原画差别不大,即使反复看几十遍肉眼很难看出细节上的差别

VMAF有一定的帮助,但只是在一定范围内适用(判断应用典型的有损视频压缩和/或空间降级后,视频退化了多少等等,一些视觉增强,如非锐化遮罩可能会降低评分标准,如DLSS或FSR能优化画质,但在VMAF眼里画质比原片更差),如果只是想编码一些东西,而不是深入编码相关的领域(例如过滤编码等)

VMAF是一个好的工具,但不适用于评估超过原片的画质,因为它没接受过后期修改的画质比原片更好的相关训练

90分以上正好,我就设分数93分,以轻微的视觉细节损失换来更小的体积(反正我看不出差别)

原片172MB 60FPS 1080p 12878kbps,魂+论坛分享的某个3D短片

H265代码:

  1. ffmpeg -y -i input.mp4 -c:v libx265 -crf 18 -preset slower -x265-params ctu=32:rskip=2:rskip-edge-threshold=2:selective-sao=2:no-sao=output.x265.mp4 output.x265.mp4
  2. ffmpeg -y -i input.mp4 -c:v libx265 -crf 35 -preset slower -x265-params ctu=32:rskip=2:rskip-edge-threshold=2:selective-sao=2:no-sao=output.x265.mp4 output.x265.mp4
  3. ffmpeg -y -i input.mp4 -c:v libx265 -crf 23 -preset slower -x265-params ctu=32:rskip=2:rskip-edge-threshold=2:selective-sao=2:no-sao=output.x265.mp4 output.x265.mp4
  4. # 耗时9小时多 crf 23只是压到99MB大小
  5. ab-av1 auto-encode -i input.mp4 -e libx265 --preset slower --keyint 3s --enc x265-params=ctu=32:rskip=2:rskip-edge-threshold=2:selective-sao=2:no-sao=input.x265.mp4 --pix-format yuv420p10le --min-vmaf 93 --max-crf 55 --min-crf 10
  6. # Searching 02:34:07 ################################################################## (crf 25.6, VMAF 93.11, size 35%)  
  7. # Encoding  01:40:41 ############################################################  (1.2 fps, eta 0s)Encoded 73.91 MiB (43%)
  8. # 耗时4小时多
复制代码
ffmpeg第一条指令压了3小时,压完后视频体积反而更大了,体积189MB……改了crf 35,压片后13.76MB,libx265视觉损失比svt-av1更大,视觉糟糕程度svt-av1 crf 60 和libx265 crf 35差不多
改了crf 23,体积99.3MB,用ab-av1压片,ab-av1给出最佳crf为25.6,压片后73.93MB,h265和svt-av1压片后的质量、压缩体积差不多,但svt-av1远远比h265快多了

以上参数压制172MB的片子,压了3次,结果花了13小时,这有些得不偿失了,与其用于压制3T的视频,3T所需的时间开销和电费够赚钱买一块8T的机械硬盘了


SVT-AV1代码:

  1. ab-av1 auto-encode -i input.mp4 --preset 2 --svt tune=0 --svt film-grain=4 --svt film-grain-denoise=0 --pix-format yuv420p10le --min-vmaf 93 --max-crf 55 --min-crf 18
  2. # Searching 00:41:51 #################################################################### (crf 36, VMAF 93.49, size 32%)  
  3. # Encoding  00:35:18 ################################################################################# (3.4 fps, eta 0s)Encoded 77.63 MiB (45%)
  4. ab-av1 auto-encode -i input.mp4 --preset 4 --svt tune=0 --svt film-grain=4 --svt film-grain-denoise=0 --pix-format yuv420p10le --min-vmaf 93 --max-crf 55 --min-crf 18
  5. # Searching 00:17:34 #################################################################### (crf 34, VMAF 93.23, size 33%)  
  6. # Encoding  00:10:59 ################################################################################## (11 fps, eta 0s)Encoded 75.43 MiB (44%)
  7. # --keyint 参数似乎没必要,如果用于网络服务提供视频,keyint是必要的,相关文档:https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/Parameters.md
  8. # enable-variance-boost=1也没啥必要,加了会增大文件体积,适用于高对比度、低对比的恐怖电影(镜头黑糊糊一团的类型,强调暗对比)
  9.                                                                                          
复制代码

preset 2将开启svt-av1所有的特性,preset 4是业余爱好者可以接受的程度,相关文档,耗时1小时多,有点慢了
preset 4搜索最佳crf耗时17分,体积为源文件的44%,编码只消耗了10分钟,以肉眼观察h265和svt-av1的差别,好吧,肉眼看不出区别


以下是ab-av1分别用h.265和svt-av1编码的PSNR、SSIM、VMAF指标对比
image.png


@蒜灵
有没有最新的av1和x265压制质量和性能对比?


如果你希望看到详细的质量性能对比,可以下载FFMetrics或QCTools,用SVT-AV1和H265批量压制一些文件,FFMetrics将给出这些文件的SSIM、PSNR和VAMF评估结果

或者看看reddit某人5月前整理的质量与性能的对比:https://www.reddit.com/r/handbra ... _x264_x265_and_av1/ ,提供的是普通视频相关的性能参数,一些视频可能不够全面,最好自己压一遍放到FFMetrics比较下
















回复

使用道具 举报

     
发表于 2024-6-23 13:22 | 显示全部楼层
普通论坛用户 发表于 2024-6-22 17:37
昨天光顾着av1an,踩了一些坑,最后发觉ab-av1更省事

ab-av1评估工具根据VMAF分数提供指定的画质分数进行 ...

这个软件是不是跟封装的格式有关 同样的参数 MP4分别转成mp4和mkv  vmaf一个90多 一个70多
回复

使用道具 举报

     
 楼主| 发表于 2024-6-23 14:35 | 显示全部楼层
烟火FY烟火 发表于 2024-6-23 13:22
这个软件是不是跟封装的格式有关 同样的参数 MP4分别转成mp4和mkv  vmaf一个90多 一个70多 ...

qwen2:
VMAF(Video Multimethod Assessment Fusion)是一个用于评估视频质量的工具,它考虑了多种因素,包括失真、帧率、分辨率等。理论上讲,转换视频格式(如从MP4到MKV或反过来)确实不应该影响视频的质量,因为这通常只涉及到容器的改变,而不会触及到视频流本身的编码。

然而,在实际操作中,你遇到的情况可能由以下几种原因造成:

重新编码:如果你在使用FFmpeg进行转换时没有使用“直通”模式(即直接将视频流复制到新的容器中),那么视频可能会被重新编码。即使你设置了相同的编码参数,由于编码器的内部优化策略,输出结果也可能有所不同,这可能导致VMAF分数的变化。

元数据处理:不同的容器格式可能对元数据的处理方式不同,这可能会影响到解码器如何解释视频流,进而影响到最终的显示效果。例如,某些元数据可能在转换过程中丢失或被修改,这可能会影响到视频的色彩空间、动态范围等,从而影响VMAF评分。

解码器差异:虽然MP4和MKV是容器格式,但它们支持不同的编解码器。如果在播放或评估过程中使用的解码器不同,也可能会导致视觉上的差异,从而影响VMAF评分。

测试条件:VMAF的评分受到测试条件的影响,包括参考视频的质量、测试环境(如显示器设置)、以及VMAF模型本身。确保在相同条件下进行测试是非常重要的。

要解决这个问题,你可以尝试以下步骤:

确保在转换时使用“直通”模式,避免不必要的重新编码。
使用相同的解码器和播放条件来测试两种格式的视频。
检查并确保所有元数据在转换过程中得到正确的保留。
如果可能,尝试在不同的设备上播放和评估视频,以确定问题是否与特定的硬件或软件配置有关。
总的来说,虽然容器格式理论上不应影响视频质量,但在实际操作中,多个环节都可能引入变数,影响最终的视频质量评估。

PS:个人只压mp4格式,其它格式很少用,具体原因具体分析
回复

使用道具 举报

     
发表于 2024-6-24 13:32 | 显示全部楼层
本帖最后由 烟火FY烟火 于 2024-6-24 13:33 编辑
普通论坛用户 发表于 2024-6-23 14:35
qwen2:
VMAF(Video Multimethod Assessment Fusion)是一个用于评估视频质量的工具,它考虑了多种因素 ...

试了一下 应该是封装容器的差别 实际画质没有降低 我直接用这个命令压hevc vmaf也有93+ -c:v libx265  -crf 25 -c:a copy   具体参数就懒得折腾了
回复

使用道具 举报

     
发表于 2024-6-24 14:28 | 显示全部楼层
mark一下。很少看到讨论,我之前也是翻 gitlab 的文档推荐命令自己写。
svt-av1 针对图片编码有个bug/feature ?不能奇数分辨率 我还写了一个脚本avif转换失败就 设置少一个像素重新转换。
回复

使用道具 举报

     
 楼主| 发表于 2024-6-24 21:41 | 显示全部楼层
xy2401 发表于 2024-6-24 14:28
mark一下。很少看到讨论,我之前也是翻 gitlab 的文档推荐命令自己写。
svt-av1 针对图片编码有个bug/featu ...

对于图片编码不太了解,个人只用于视频编码的转换

有奇怪BUG,应该向svt-av1作者反馈问题
回复

使用道具 举报

     
发表于 2024-6-25 08:23 | 显示全部楼层
普通论坛用户 发表于 2024-6-24 21:41
对于图片编码不太了解,个人只用于视频编码的转换

有奇怪BUG,应该向svt-av1作者反馈问题 ...

社区有很多讨论了 可能 intel 认为这个是 特性
奇数图像尺寸和 svt-av1 编码器 #544
https://github.com/AOMediaCodec/libavif/issues/544
回复

使用道具 举报

     
发表于 2024-6-26 09:46 来自手机 | 显示全部楼层
烟火FY烟火 发表于 2024-6-23 13:22
这个软件是不是跟封装的格式有关 同样的参数 MP4分别转成mp4和mkv  vmaf一个90多 一个70多 ...

可能和编码后各帧时间戳有关,没对齐的话,计算的VMAF就不准确。

—— 来自 鹅球 v3.0.86-alpha
回复

使用道具 举报

     
发表于 2024-6-26 09:48 来自手机 | 显示全部楼层
普通论坛用户 发表于 2024-6-24 21:41
对于图片编码不太了解,个人只用于视频编码的转换

有奇怪BUG,应该向svt-av1作者反馈问题 ...

不只是svt-av1,其他编码器比如x264、x265都不支持奇数的分辨率。

—— 来自 鹅球 v3.0.86-alpha
回复

使用道具 举报

     
发表于 2024-6-26 10:10 | 显示全部楼层
elxy 发表于 2024-6-26 09:48
不只是svt-av1,其他编码器比如x264、x265都不支持奇数的分辨率。

—— 来自 鹅球 v3.0.86-alpha ...

但是av1其他的两个编码器都支持。

今天nga也看到一个av1交流贴
​[大姐姐保存指南3rd]是拥抱AV1的时候了 https://bbs.nga.cn/read.php?tid=39249771
回复

使用道具 举报

     
发表于 2024-6-28 20:04 来自手机 | 显示全部楼层
咨询一下,用nvenc压比svt差在哪里?

好像你们都不用显卡?



—— 来自 HUAWEI VOG-AL00, Android 10上的 S1Next-鹅版 v3.0.0.81-alpha
回复

使用道具 举报

     
发表于 2024-6-28 23:40 | 显示全部楼层
没试下 vvc?
回复

使用道具 举报

     
发表于 2024-6-29 01:53 来自手机 | 显示全部楼层
uneedme 发表于 2024-6-28 23:40
没试下 vvc?

生产环境还是用比较成熟稳定的方案比较好。比如说vvc,目前最好(且唯一)的开源编码器是vvenc,而且在可预见的未来它还会继续迭代优化。如果现在就用vvc压制的话,那过个几年看着用过时版本压制出的视频极大概率会后悔的。
回复

使用道具 举报

     
 楼主| 发表于 2024-7-1 13:56 | 显示全部楼层
风夏 发表于 2024-6-28 20:04
咨询一下,用nvenc压比svt差在哪里?

好像你们都不用显卡?

reddit的ffmpeg贴吧有人认为显卡压缩的比CPU压缩的体积更大些

具体差别,你可以搜索一下
回复

使用道具 举报

     
 楼主| 发表于 2024-7-1 14:14 | 显示全部楼层

由于专利许可,VVC注定很难受到欢迎,当前免版税也就AV1,VP9免费用……(很多消费者产品不支持VVC解码器)

个人只用:AV1/HEVC/VP9
回复

使用道具 举报

     
发表于 2024-7-1 18:58 | 显示全部楼层
普通论坛用户 发表于 2024-7-1 14:14
由于专利许可,VVC注定很难受到欢迎,当前免版税也就AV1,VP9免费用……(很多消费者产品不支持VVC解码器 ...

普通用户 和版税还没什么关系吧?

x264就是山寨破解版的h264 hevc就是民间编译版的h265 vvc也会是民间编译版的

vvc如果itvc承认了 那就是h266 硬件都会支持的

总之 版权问题 和 民间使用 基本没什么交集
回复

使用道具 举报

发表于 2024-7-1 19:57 | 显示全部楼层
本帖最后由 Jet.Black 于 2024-7-1 19:59 编辑
uneedme 发表于 2024-7-1 18:58
普通用户 和版税还没什么关系吧?

x264就是山寨破解版的h264 hevc就是民间编译版的h265 vvc也会是民间编 ...

H264,H265是标准并不是软件,不存在破解一说,

专利也是公共领域,并不存在破解。

X264,X265只是符合标准的一种编码实现。

开源编码器X264,X265基本合法,

但是用户将其用于自己的商业产品,需要自行解决专利问题。
回复

使用道具 举报

     
发表于 2024-7-1 20:16 | 显示全部楼层
uneedme 发表于 2024-7-1 18:58
普通用户 和版税还没什么关系吧?

x264就是山寨破解版的h264 hevc就是民间编译版的h265 vvc也会是民间编 ...

你在说什么……
x264和x265分别只是社区针对H.264/AVC和H.265/HEVC标准开发的开源编码器,专利费本身就不是针对软件开发者收的,而是针对使用者收的,只是这种使用者一般是指用于商业用途的大公司,和普通人没什么关系。换句话说如果你用HEVC编码的视频来提供网络传输服务/蓝光光盘,那无论你用什么编码器都得掏钱。
而且itvc又是什么鬼,开发视频编码标准的两个组织是ITU-T和ISO下属的MPEG,ITU-T发布的的H.266标准和ISO MPEG发布的VVC标准是等价的,只是由两个不同的组织分别发布而已。

—— 来自 S1Fun
回复

使用道具 举报

     
发表于 2024-7-1 20:20 | 显示全部楼层
而且ITU-T和MPEG在开发编码标准的时候本身就会开发对应的开源参考编码器(参考模型,reference model),x265一开始就是从H.265/HEVC的参考模型HM里fork来的。而且x265也不是“民间”实现,开发它的MulticoreWare Inc.是一家正经的公司。

—— 来自 S1Fun
回复

使用道具 举报

     
发表于 2024-7-2 22:07 | 显示全部楼层
本帖最后由 uneedme 于 2024-7-2 22:34 编辑
zhguyu 发表于 2024-7-1 20:16
你在说什么……
x264和x265分别只是社区针对H.264/AVC和H.265/HEVC标准开发的开源编码器,专利费本身就不 ...

x264 变帧率 隔行扫描 自适应scale(那个功能的正式名字忘了......) 之类的 都没从标准h264上扒下来

很山寨很残的encoder(我记得扒过doom9的史记 是从苹果的h264编码扒出来的一部分源代码逐渐修改出来的)


itvc是写错了 我不记得视讯小组的缩写名字了

vvc我看到的是腾讯在主导吧?it-ut组织还没认可吧?好像连合作认定266标准都谈不上

it-ut完全可以自己出自己体系的h266 并行也说不上 只能说是同一代的编码器


是说 x265的名字让MulticoreWare Inc.给占了吗?所以只能改叫hevc? 我看doom9也是 x265 HEVC Encoder 板块 其实并没有刻意区隔hevc和x265的含义

doom9上并没有官方组织或者公司提供编码器的使用 都是民间编译版

没有商业组织去提供编译版 所以说民间编译版 没什么问题啊 难道你用的是自己源码编译的encoder?那你可厉害了



我回看了一下 自己说的 没什么大问题啊 还至于被专门指出更正?

不过严谨态度 值得称赞!



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-28 06:53 , Processed in 0.219186 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表