找回密码
 立即注册
查看: 1397|回复: 1

vs批量压制脚本,支持多版本字幕/花屏检查/自动封装/视频切片

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    26

    主题

    328

    回帖

    1056

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    418206
    Lambholl 发表于 2024-10-26 04:29:36 | 显示全部楼层 |阅读模式
    本帖最后由 Lambholl 于 2026-5-19 23:07 编辑

    人在做大量重复劳动时,出错的概率永远比机器高 ——题记


    以上可以说是经验谈,也可以说是教训,也就是这样的经验使我们LPSub从一开始纯手工压制,到一步步加上自动化、完善自动化——因为人为的错误出现过太多次了。
    每集番剧发3个版本,再加上集数众多,总是难以避免百密一疏,所以这个脚本便是减少错误的一环。

    此脚本应用了大佬们写的 dual_out,即不使用 vspipe 输出,而是使用 python 的 subprocess 进行 pipe 操作,
    之前也提到过,这么做可以在同时输出多个不同字幕的版本时,省去重复的画面预处理,节省算力与时间。

    GitHub

    这个脚本用了装饰器语法糖,只需要把写完的vs脚本丢进一个函数中,return last就行了,例如:
    1. import vapoursynth as vs
    2. core=vs.core
    3. import lamvsfunc as lamvs
    4. import zvs

    5. @lamvs.encodeProcess(encodeTypes=['JPSC','JPTC','HEVC'], delFiles=True, rpc=True)
    6. def encodeVideo(source=''):
    7.     src=core.lsmas.LWLibavSource(source).fmtc.bitdepth(bits=16,dmode=1)
    8.     last=src
    9.     last=zvs.zmdg(last,thsad=120,thscd1=250,truemotion=True,refinemotion=True,lf=0.2,cs=True)
    10.     last=zvs.bm3d(last,sigma=[2,1,1],sigma2=[0.8,0.5,0.5],radius=1,preset='np',vt=1,mode='cuda_rtc')
    11.     # more produces
    12.     return last
    13.   
    14. if __name__ == '__main__':
    15.     videos = lamvs.getSources() #得到一个文件名列表
    16.     # 使用此函数,将需要压制的片源文件依次拖拽进窗口回车,一行对应一个文件,输入空行以结束
    17.     for i in videos:
    18.         encodeVideo(i)
    复制代码

    以下是对参数的详细说明:
    sourceType: 'Web'(默认) 或者 'BD'
    ext: 片源文件的扩展名,Web 时默认为 '.mkv' ,BD 时默认为 '.m2ts'
    encodeTypes:传入列表,从 'CHS', 'CHT', 'JPSC', 'JPTC', 'HEVC' 中选择一项或多项,分别需要准备与片源文件名相同的字幕文件,后缀分别为.sc  .tc  .jpsc .jptc  None +.ass
      例如片源文件为 0d00721.mkv,选择压制 CHS,就需要 0d000721.sc.ass
    subrender:'libass'(默认) 或者 'vsfiltermod'
    chapter:布尔值,往压制完成的视频中封装章节文件,需要提前准备与片源文件名相同的 txt 文件,例如 0d000721.txt
    delFiles:布尔值,在压制完成后删除压制过程产生的中间文件
    rpc:布尔值,在压制完成后进行花屏检查,带有字幕的压制版本会与在加上字幕后的片源进行对比,以避免误报
    xxxx_path:顾名思义;如果在同一文件夹下或在环境变量中,则不需要传入参数
    param_x264/param_x265:x264/x265的参数,为避免出现问题,更改参数时请在默认值的基础上进行修改,确保格式一致
    clip_frames:视频切片,以list[int]形式传入每一片的起始帧号,0可以不传。当传入此参数时,章节封装、字幕封装均不可用

    同时感谢各位大佬的帮助,具体帮助内容写在了代码注释中)
    也欢迎各位提出 issue 或者 pr 等





    ↑此帖是lam半夜写脚本写上头了的产物,要是有什么问题大概是半夜脑子不好使了(



    评分

    参与人数 1活跃度 +1000 收起 理由
    铁皮厚厚 + 1000 赞一个!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    26

    主题

    328

    回帖

    1056

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    418206
    Lambholl  楼主| 发表于 2026-5-19 23:09:22 | 显示全部楼层
    2026.05.19更新:视频切片功能
    示例代码:
    1. from vsenv import *
    2. import lamvsfunc as lamvs

    3. clips_ncop = [
    4.     0, 744, 1488, 2232, 2976, 3720, 4464, 5208, 5952, 6696, 7440, 8184, 8904,
    5. ]

    6. @lamvs.encodeProcess(sourceType='BD', encodeTypes=['HEVC'], delFiles=True, param_x265='"{0}" --y4m -D 10 --preset veryfast --crf 18 -o "{1}.mp4" -', clip_frames=clips_ncop, qaac_path=r"qaac.exe")
    7. def encode(source):
    8.     src = core.lsmas.LWLibavSource(source)
    9.     last = src.fmtc.bitdepth(bits=16)
    10.     return last

    11. if __name__ == '__main__':
    12.     encode(input('> ').replace('"',''))

    复制代码


    回复

    使用道具 举报

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

    本版积分规则

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