194

主题

126

回帖

4万

修为

站长

积分
101391

曼加塔第一期曼加塔第二期




前言:小丸几乎十年没更新了(我不是小丸的原作者,只是续写),我上次发布还是2023年【小小丸工具箱 V1.5.4(原创)传送门https://bbs.monster/forum.php?mod=viewthread&tid=1792】,BUG挺多的,主要是不支持低端硬件,所以这次增加了一些硬件检测,自动下降指令。

原创开源-小小丸工具箱V2.0.0 更新日志(未发布)

原创开源-小小丸工具箱V2.0.0 更新日志(未发布)


软件版本 2.0.0
发布日期:[2026.1.15]


修复:
- 手机和浏览器都支持高于h264的,没必要留264了。
- 根据硬件设备自动判断加速命令以及是否支持硬编av1(需要2023年之后的显卡)
- 显卡的判断比之前更细化了,我发现之前没有真正落实RX显卡。
- 现在的intel和amd核显(或无核显)也都用svt的软编码,舍弃dxd12。免得遇到F卡翻车~
- 真正支持A卡。(之前是预埋好所需的库,但exe并没写完A卡支持)

改进:
- 右排是4个高频的统一预设,省去了选择困难症烦恼,用户彻底告别命令行参数(本来总想着高自由度,那还不如无UI,现在确定是面向小白的便捷工具。专业用户自然会去用ffmpeg命令。)
- 舍弃unity格式,如果需要的请用旧版(1.5.4绝版了),其实当初就是主打unity透明mov的,可惜我完全不懂得宣讲。
- 时隔一年半,现在的代码和逻辑能力比之前强很多,当然 也可能是因为前面已经铺垫过,这次可以集中精力解决问题和优化。
- 部分学习笔记会发到博客:bbs.monster
- 最变态的工作量还是在于我重新再次编译了ffmpeg定制版以及做了12种极致预设参数(可能涉及数百种参数)。




部分核心代码展示(大概有73个函数,下面是其中之3)。易语言几乎不能用AI写,纯手搓。


负责不同设备的质量与性能控制:



.判断开始 (勾选GPU编码.选中)
    编码输出参数 = 编码器参数GPU  ' 在无显卡的时候自动强制用svt避免报错
.默认
    编码输出参数 = “ -c:v libsvtav1 ”
.判断结束

.判断开始 (单选框1.选中 = 真)  ' 中损快压
    状态条1.置文本 (3, “适合快速转码”)
    .判断开始 (编码输出参数 = “ -c:v av1_amf ”)
        质量控制参数 = “-quality balanced -rc cqp -qp_i 21 -qp_p 23 -qp_b 25 -bf 3”
    .默认

    .判断结束
    .判断开始 (编码输出参数 = “ -c:v av1_nvenc ”)
        质量控制参数 = “-pix_fmt p010le -rc constqp -qp 26 -p2”
    .默认

    .判断结束
    .判断开始 (编码输出参数 = “ -c:v libsvtav1 ”)
        质量控制参数 = “-crf 25 -preset 8 ”
    .默认

    .判断结束

.判断 (单选框2.选中 = 真)  ' 低损快压
    状态条1.置文本 (3, “适合大批量存档”)
    .判断开始 (编码输出参数 = “ -c:v av1_amf ”)
        质量控制参数 = “-quality speed -rc cqp -qp_i 21 -qp_p 23 -qp_b 25 -bf 3 -pix_fmt p010le”
    .默认

    .判断结束
    .判断开始 (编码输出参数 = “ -c:v av1_nvenc ”)
        质量控制参数 = “-pix_fmt p010le -rc constqp -qp 24 -p4”
    .默认

    .判断结束
    .判断开始 (编码输出参数 = “ -c:v libsvtav1 ”)
        质量控制参数 = “-crf 20 -preset 5”
    .默认

    .判断结束

.判断 (单选框3.选中 = 真)  ' 高损慢压
    状态条1.置文本 (3, “适合极致压缩”)
    .判断开始 (编码输出参数 = “ -c:v av1_amf ”)
        质量控制参数 = “-quality quality -rc cqp -qp_i 21 -qp_p 23 -qp_b 25 -bf 3 -pix_fmt p010le”
    .默认

    .判断结束
    .判断开始 (编码输出参数 = “ -c:v av1_nvenc ”)
        质量控制参数 = “-pix_fmt p010le -p7 -rc vbr -cq 22 -b:v 0”
    .默认

    .判断结束
    .判断开始 (编码输出参数 = “ -c:v libsvtav1 ”)
        质量控制参数 = “-pix_fmt yuv420p10le -svtav1-params tune=0:preset=3 -crf 30”
    .默认

    .判断结束

.判断 (单选框4.选中 = 真)  ' 低损慢压
    状态条1.置文本 (3, “适合极致质量”)
    .判断开始 (编码输出参数 = “ -c:v av1_amf ”)
        质量控制参数 = “-quality quality -rc cqp -qp_i 21 -qp_p 23 -qp_b 25 -bf 3 -pix_fmt p010le”
    .默认

    .判断结束
    .判断开始 (编码输出参数 = “ -c:v av1_nvenc ”)
        质量控制参数 = “-rc constqp -qp 18 -p7”
    .默认

    .判断结束
    .判断开始 (编码输出参数 = “ -c:v libsvtav1 ”)
        质量控制参数 = “-pix_fmt yuv420p10le -svtav1-params tune=0:preset=2 -crf 20”



下面这个函数是执行按钮,核心逻辑:

.版本 2
.支持库 spec
.支持库 iext

' 判断一下是否需要弹出输出目录选择窗
.判断开始 (勾选导出原目录.选中)

.默认
    指定导出目录 = 对话框_打开文件夹 (“输出目录”, ) + “\”
    .如果真 (指定导出目录 = “”)
        勾选导出原目录.选中 = 假
    .如果真结束
    调试输出 (“指定导出目录 =” + 指定导出目录)
.判断结束


.计次循环首 (超级列表框1.取表项数 (), n)
    .如果真 (超级列表框1.取标题 (n - 1, #列索引_文件路径) ≠ “”)
        .如果真 (超级列表框1.取当前状态图片 (n - 1) = 1)
            任务数 = 任务数 + 1
        .如果真结束

    .如果真结束

.计次循环尾 ()

.如果真 (任务数 = 0)
    信息框 (“请勾选需要转码的文件!”, 0, , )
    返回 ()
.如果真结束

状态条1.置文本 (1, “请等待”)
' 开始计时
时钟1.时钟周期 = 1000
.计次循环首 (超级列表框1.取表项数 (), n)
    .如果真 (超级列表框1.取标题 (n - 1, #列索引_文件路径) ≠ “”)
        .如果 (超级列表框1.取当前状态图片 (n - 1) = 1)
            超级列表框1.置标题 (n - 1, #列索引_状态, “正在转码”)
            全_总时间 = 超级列表框1.取标题 (n - 1, #列索引_时长)
            处理事件 ()
            .判断开始 (勾选导出原目录.选中)
                导出的文件名 = 文件路径空格处理 (文件名称处理 (超级列表框1.取标题 (n - 1, #列索引_文件路径), , , , 真)) + 输出后缀名  ' 把input路径去掉扩展名,然后加上后缀判断 ()
            .默认
                .如果 (指定导出目录 = “”)
                    导出的文件名 = 文件路径空格处理 (文件名称处理 (超级列表框1.取标题 (n - 1, #列索引_文件路径), , , , 真)) + 输出后缀名
                .否则
                    导出的文件名 = 指定导出目录 + 文件_取文件名 (超级列表框1.取标题 (n - 1, #列索引_文件路径), 假) + 输出后缀名
                    导出的文件名 = 文件路径空格处理 (导出的文件名)  ' 修正BUG
                    调试输出 (“指定输出位置:” + 导出的文件名)
                .如果结束

            .判断结束


            .如果真 (取反 (勾选覆盖.选中))
                .如果真 (文件_是否存在 (导出的文件名))
                    超级列表框1.置标题 (n - 1, #列索引_状态, “跳过覆盖”)
                    超级列表框1.置状态图片 (n - 1, -1)
                    到循环尾 ()
                .如果真结束

            .如果真结束


            当前命令 = 解码输入参数 + “ -y ” + 文件路径空格处理 (超级列表框1.取标题 (n - 1, #列索引_文件路径)) + “ -i” + 编码输出参数 + 质量控制参数 + “ -c:a copy ” + 导出的文件名

            ' [全局参数] [输入参数] -i 输入文件 [输出参数/编码器参数] 输出文件
            ' ↑          ↑            ↑                ↑              ↑
            ' -hwaccel    -c:v h264_amf   固定      -c:v h265_amf + 编码器参数(preset/crf/g/bitrate等)


            调试输出 (“当前命令:” + 当前命令)  ' 默认覆盖
            取控制台程序文本信息 (ffmpeg, 当前命令, &回调函数, 全_CMD进程ID, )
            超级列表框1.置标题 (n - 1, #列索引_状态, “完成”)
            已完成数 = 已完成数 + 1
            进度 = 四舍五入 (到小数 (已完成数) ÷ 到小数 (任务数) × 100, )

            进度标签总.标题 = “总进度:” + 到文本 (进度) + “ %”
            进度条总.位置 = 进度

            超级列表框1.置状态图片 (n - 1, -1)
        .否则
            ' 超级列表框1.置标题 (n - 1, #列索引_状态, “跳过转换”)
        .如果结束

    .如果真结束
    处理事件 ()
.计次循环尾 ()
超级列表框1.重画 ()
进度标签单.标题 = “单进度:” + 到文本 (0) + “ %”
进度条单.位置 = 0
进度标签单.标题 = “总进度:” + 到文本 (0) + “ %”
进度条总.位置 = 0

时钟1.时钟周期 = 0
全_秒数 = 0
超级列表框1.禁止 = 假
状态条1.置文本 (1, “完成”)
' 信息框 (“任务全部完成!”, 0, , )





显卡检测(没包含专业AI卡,毕竟那是Linux用):

.子程序 检查显卡
.局部变量 i, 整数型
.局部变量 有效显卡序号, 整数型

系统_取显卡信息列表 (显卡信息数组)
.如果真 (取数组成员数 (显卡信息数组) = 0)
    _启动窗口.勾选GPU编码.禁止 = 真
    _启动窗口.状态条1.置文本 (4, “显卡类型:未检测到            ”)
    _启动窗口.状态条1.置文本 (5, “SDK:未知”)
    返回 ()
.如果真结束

调试输出 (“测试:当前显卡数量” + 到文本 (取数组成员数 (显卡信息数组)), 0, , )

.如果真 (取数组成员数 (显卡信息数组) ≠ 0)
    .计次循环首 (取数组成员数 (显卡信息数组), i)
        调试输出 (“发现显卡:” + 显卡信息数组 .显卡名称, 0, , )
        .如果真 (文本_寻找文本 (显卡信息数组 .显卡名称, “nvidia”, , 真) ≠ -1)
            显卡品牌 = 1
            _启动窗口.状态条1.置文本 (4, “显卡类型:NVIDIA           ”)
            显卡型号 = 到整数 (正则_匹配方式3 (显卡信息数组 .显卡名称))
            _启动窗口.状态条1.置提示文本 (4, 显卡信息数组 .显卡名称)
            .如果 (显卡型号 > 4000)
                编码器参数GPU = “ -c:v av1_nvenc ”  ' 高端显卡
                输出后缀名 = “_av1.mp4”
            .否则
                编码器参数GPU = “ -c:v hevc_nvenc ”
                输出后缀名 = “hevc.mp4”
            .如果结束

            跳出循环 ()
        .如果真结束
        .如果真 (文本_寻找文本 (显卡信息数组 .显卡名称, “radeom”, , 真) ≠ -1)
            显卡品牌 = 2
            _启动窗口.状态条1.置文本 (4, “显卡类型:Radeon           ”)
            显卡型号 = 到整数 (正则_匹配方式3 (显卡信息数组 .显卡名称))
            _启动窗口.状态条1.置提示文本 (4, 显卡信息数组 .显卡名称)
            .如果 (显卡型号 > 7000)
                编码器参数GPU = “ -c:v av1_amf ”  ' 高端显卡
                输出后缀名 = “_av1.mp4”
            .否则
                编码器参数GPU = “ -c:v hevc_amf ”
                输出后缀名 = “hevc.mp4”
            .如果结束

            跳出循环 ()
        .如果真结束

    .计次循环尾 ()

    .如果真 (显卡品牌 = 0)
        _启动窗口.状态条1.置文本 (4, “显卡类型:未检测到            ”)
        _启动窗口.状态条1.置文本 (5, “SDK:未知”)
        _启动窗口.状态条1.置提示文本 (4, 显卡信息数组 [1].显卡名称)
        编码器参数GPU = “ -c:v libsvtav1 ”  ' 强制软编码
        输出后缀名 = “_av1.mp4”

        返回 ()
    .如果真结束

.如果真结束

.如果真 (显卡品牌 = 1)
    .如果 (文件_是否存在 (“C:\Windows\System32\nvcuda.dll”))
        _启动窗口.状态条1.置文本 (5, “SDK:已安装CUDA”)
        调试输出 (“已安装CUDA”)
    .否则
        _启动窗口.状态条1.置文本 (5, “SDK:未安装CUDA”)
        _启动窗口.勾选GPU编码.禁止 = 真
        调试输出 (“未安装CUDA”)
    .如果结束

.如果真结束
返回 ()

.如果真 (显卡品牌 = 2)
    _启动窗口.状态条1.置文本 (4, “显卡类型:AMD            ”)
    .如果 (文件_是否存在 (“C:\Windows\System32\amfrt64.dll”))
        _启动窗口.状态条1.置文本 (5, “SDK:已安装AMF”)
        调试输出 (“SDK:已安装AMF”)
    .否则
        _启动窗口.状态条1.置文本 (5, “SDK:未安装AMF”)
        _启动窗口.勾选GPU编码.禁止 = 真
        调试输出 (“SDK:未安装AMF”)
    .如果结束

.如果真结束
返回 ()


代码文件也会开源,等我改好发布。
主题回复
倒序浏览

1461查看2回复

194

主题

126

回帖

4万

修为

站长

积分
101391

曼加塔第一期曼加塔第二期

LeoSasion 昨天 18:25
182513waswybnyyeckwkzi.webp

漏写了一些情况,已补充。再结合测试,改正了一些错误。

点评

刚才又优化了许多参数,以最终开源为准  发表于 昨天 19:05
举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

© 2001-2026 BBS.Monster