分页: 1 / 2

关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2018-03-11 7:57
msg7086
之前为了实现自己的一些需求,所以给x265加入了GOP-Based输出补丁,可以实现断点续压、分段压制、边压边播、篡改数据包等效果,可谓是各位压制大佬的拆楼挖沟利器。然而一直懒癌发作,一直没有花时间来写这篇说明书。现在算是补上。

准备工具 基本用法
x265输出时后缀为.gop,即可输入分段文件。

代码: 全选

例: x265 --crf 20 -o out.gop in.avs
注意:分段文件会很多,建议先新建一个文件夹,然后把gop文件放入其中,即 -o gops\out.gop。

gop_muxer可将gop文件封装为mp4,输出文件和最后一个输入文件同名。

代码: 全选

例: gop_muxer gops\out.gop gops\out2.gop
将得到包含两段视频的文件gops\out2.mp4。
注意:同名文件将会被覆盖,并且不会有任何提醒!

文件结构组成

代码: 全选

mv\mv.gop
mv\mv.headers
mv\mv.options
mv\mv.data-0
mv\mv.data-240
mv\mv.data-480
mv\mv.data-575
mv\mv.data-815
  • *.gop —— 文件索引,包含所有数据文件和头文件的文件名。
  • *.headers —— x265输出的裸流文件头,包含SPS PPS VPS SEI等数据。二进制文件。
  • *.options —— x265输出给封装程序的选项,包含FPS VUI等数据。
  • *.data-* —— 帧数据。横线后的数字为GOP的起始帧编号。
断点续压时,可以通过编辑gop文件索引来达到选择性删除gop的目的。

高级用法之断点续压
场景:电网断电;内存不足崩盘;熊孩子捣乱等。
做法:
  • 找到最后一个data文件,例如mv.data-12345,这个12345便是最后一个GOP的起始点。
  • 修改AVS,在最后加上trim(12345,0)。Vapoursynth同理。
  • 修改输出文件名,例如mv2.gop,然后继续压制。
  • 用编辑器打开mv.gop,删除最后一行mv.data-12345,然后保存。
  • 压制完成后,用 gop_muxer mv.gop mv2.gop 获得完整的文件。
注意:请保证压制参数相同。中途修改参数造成播放不正常,后果自负。

高级用法之分段压制
场景:CPU太多,AVS太慢;服务器太多,资源无法有效利用等。
做法:
  • 在视频中的合适位置找到场景切换作为关键帧。
    例:3000帧的片分为4段,分别找到770-1490-2304帧的场景切换作为关键帧。
  • 复制AVS为4份,分别加上合适的切割代码,例如mv3.avs加上trim(1490,2303)。Vapoursynth同理。
  • 分别运行x265,在不同的CPU或不同的服务器上压制,得到4组输出视频。
  • 压制完成后,用 gop_muxer mv1.gop mv2.gop mv3.gop mv4.gop 获得完整的文件。
注意:请保证压制参数相同。中途修改参数造成播放不正常,后果自负。

高级用法之边压边播
场景:检查已压制视频是否播放正常。
做法:
  • 在压制进行中时,用 gop_muxer ×.gop 可直接获得压制完成部分的文件。
注意:最后一帧可能会花屏,这是由于最后一帧数据没有完整写入文件就被封装了的缘故,不影响压制过程。
要避免花屏,可以复制gop到新的文件,等待当前gop压制完毕后再封装。

其它
gop_muxer会自动跳过不存在的gop文件,因此可以在最后指定一个不存在的文件来更改输出文件名。

代码: 全选

例: gop_muxer gops\mv1.gop gops\mv2.gop pikachu.gop
会将两个视频合并封装至pikachu.mp4中。
注意:同名文件将会被覆盖,并且不会有任何提醒!

x265与gop_muxer对VFR的支持都不好,若需要VFR请自行用其他工具导入时间戳。

与其他方案相比较的优势
  • 断点续压,与MKV方案相比:
    MKV切割拆流位置不精确,找断点比较费力;合并文件时会留下额外的头信息帧。
    --
  • 分段压制,与MP4/MKV合并方案相比:
    合并文件时会留下额外的头信息帧,曾经有遇到过播放器在合并点崩溃的情况。
    gop_muxer会自动跳过头信息帧,因此输出的文件和不分段压制出的文件结构相同。
    --
  • 边压边播,与MKV方案相比:
    不依赖播放器打开不完整文件的偶然性;不依赖MKV输出(意味着不用忍受过时的Haali Muxer带来的各种问题)。
    封装完的临时MP4文件与最终输出的成品文件完全相同。

Re: 关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2018-03-13 12:39
ceshiwenfq
你好,感谢说明,试了一下没实现,请问哪里错了
传参:
vspipe.exe --y4m test.vpy - |"x265-10b.exe" --y4m -D 10 --crf 20 --preset medium -o test.gop -
header、gop、option文件生成成功,但所有帧信息都集中到data-0里,跑了三四千帧,都只有一个data-0文件。
测试版本2.6asuna和2.7yuuki

Re: 关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2018-03-14 5:15
msg7086
--no-open-gop 试一下。

Re: 关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2018-03-16 7:31
litfal
這簡直神器!
救了我等RP狗...
以前CPU差的時候編碼器崩潰,內心也跟著崩潰了

現在也能幫我分段壓那些16C32T用不完的超高解析度片源

另外好奇,有沒有可能跑一個 1pass生成stats,
再解析 stats 找出 2個或數個適合切割的點
我覺得可能是找碼率的峰值,或是碼率變率的峰值,在那邊切不會損失太多壓縮率或畫質

Re: 关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2018-03-16 10:28
msg7086
这个有点介入太多了,不是很想去实现。本来2pass就很少用到,特别是avs运算量比较大的时候,更得不偿失了。

原本自己avs挂载一下找到合适的分断点就不难。

Re: 关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2018-03-31 0:05
litfal
我發現如果處裡的是高解析度(4Kx4K) 與高FPS (90) 的源,似乎就不會切割.data檔了,會一個壓到底

Re: 关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2018-04-08 7:15
msg7086
litfal 写了: 2018-03-31 0:05 我發現如果處裡的是高解析度(4Kx4K) 與高FPS (90) 的源,似乎就不會切割.data檔了,會一個壓到底
还是请检查一下是否正确生成了IDR帧 —— 也就是,opengop是否正确关闭了。

Re: 关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2018-05-08 14:05
K19
我投在线网站所以只能x264,但是压制时CPU喂不饱,想问下这种分段压制在x264下有没有实现?

Re: 关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2018-05-24 4:23
msg7086
K19 写了: 2018-05-08 14:05 我投在线网站所以只能x264,但是压制时CPU喂不饱,想问下这种分段压制在x264下有没有实现?
可以的,把我的补丁包移植到x264后编译即可。gop_muxer可能也需要修改以适应avc的头包。

Re: 关于x265-Yuuki中实现的GOP-Based断点续编码的一些简要介绍说明

发表于 : 2019-06-30 17:11
Niconeiko
av1或许可以通过这种方式实现多线程压制...