|
|
前言:小丸几乎十年没更新了(我不是小丸的原作者,只是续写),我上次发布还是2023年【小小丸工具箱 V1.5.4(原创)传送门https://bbs.monster/forum.php?mod=viewthread&tid=1792】,BUG挺多的,主要是不支持低端硬件,所以这次增加了一些硬件检测,自动下降指令。
原创开源-小小丸工具箱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”)
.如果结束
.如果真结束
返回 ()
代码文件也会开源,等我改好发布。
|
|