这个主要是解释脚本命令为主
以下是我的理解 如果有不对的 地方 欢迎 留言
视频转mkv sh-gui 一个滚动条实例 把一条 命令 结构装到另外一条 命令里 xx= $() $xx 和编程一样 框框套框框 主窗口是桌面
虽然 GUI脚本 不会体现出窗口的代码 那是应为GUI是一个窗口程序 所有按钮 各种框 都是窗口的子集
#!/bin/bash
#转mkv 编码格式 H265 音频 acc 码率 128K 每秒帧数 crf=28
#gui 脚本一定要声明 系统语言 英文 可以不申明
LANG="zh_CN.UTF-8" #这样按钮才会跟谁系统,显示为当前系统的语言,申明比不申明好。
d1="$(zenity --file-selection --title="视频文件在哪 ?" \
--directory)"
# $? 是上一个程序执行是否成功的标志#
# 如果执行成功则$? 为0,否则 不为0#
# && 同|| 意思大体相同都是选择 &&我想优先级比较高 自动完成
# && exit 后自动跳到了 $d2 $d2结束后 就给一个名字 开始转换同步执行进度条 进度条的时间取决于机器的性能 模块 libx265
# && 逻辑与 可以理解为并且的意思
# || 逻辑或,可以理解为或者的意思,也就是条件可以2取一#
# ! 逻辑非 (一元表达式)#
[[ "$?" != 0 ]] && exit # || sleep 2 长时间不选择就关闭 这个适合网络连接
d2="$(zenity --file-selection --title="转换保存在哪 ?" \
--directory)"
[[ "$?" != 0 ]] && exit #在这边加上时间就强制结束了
for i in "$d1"/* ; do # i 和 "$d1"/* 这是一个路径 坑爹要用甲骨文发明个编程语言 in 你不能用中文 外国人天生会编程
## 筛选出实际的文件名 #filename=文件名字
filename=$(basename -- "$i")
## 根名字 的参数 $i # "$d2"/"${filename%.*} # 一个可以扩展接口的方法
## 文件名=变量 同一文件夹里 不会封装 这也是一个笨办法
## 其实编程也是过家家没什么 就看谁的逻辑更合理
## 我喜欢结果导向过成 我的目的是功能 $是导向过程的 笑死我了
## 使用的模块 libx265 这个外国人是个大厨 肉块
## 没有这个模块这个脚本就不会起作用
## ffmpeg是一个内置解码器? 终端输入也可以或得具体参数
## crf=27 也是一个可选参数 视频每秒中的画面 超过30帧每秒就没有意义了 27就可以
## 动画 才10几帧每秒 3d动画除外 有些60 FPS 这个和显示器刷新有关
## libx265 可选模块 x264
## 视频解码 https://baike.baidu.com/item/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81/839038?fr=aladdin
ffmpeg -i "$i" -c:v libx265 -preset medium -x265-params crf=28 \
-c:a aac -strict experimental -b:a 128k "$d2"/"${filename%.*}.mkv" # 谁机名字?128k 也是一个可选参数
# ffmpeg 和 zenity 一起 ffmpeg 结束时 zenity也结束
done | zenity --progress --pulsate --title "Processing " \
--text "正在转换请稍候" \
--pulsate --auto-close --auto-kill