脚本增加选项,解决问题
切分的视频文件名带引号
原因是拼接的输出文件后缀为(1),文件系统会默认在文件名外层加上引号,将后缀改为_1的形式,能够正常分割
output_path="$output_dir/${video_base}_$((i + 1)).${video_name##*.}"
切分文件数量不是最少数量
为了防止原始文件小于指定文件块大小,分割数量是0,默认数量+1, 导致分割文件数量不是最优,修改为通过可以判断指定大小和文件大小,执行分割。
if (( video_size_mb < chunk_size_mb )); then
echo "文件大小 ($video_size_mb MB) 小于指定的切割大小 ($chunk_size_mb MB),退出。"
exit 1
fi
给脚本添加选项,可以选择以GB,MB甚至B为单位来分割视频(限制最小分割大小是1MB)
convert_to_mb() {
local size="$1"
local unit="$2"
case "$unit" in
-MB)
echo "$size"
;;
-GB)
echo "$(echo "$size * 1024" | bc)"
;;
-B)
echo "$(echo "$size / 1024 / 1024" | bc)"
;;
*)
echo "无效的单位: $unit"
exit 1
;;
esac
}
chunk_size="$2"
unit="$3"
chunk_size_mb=$(convert_to_mb "$chunk_size" "$unit")
if [ "$chunk_size_mb" -lt 1 ]; then
echo "最小分割大小:1MB"
exit 1
fi
在shell脚本中获取函数的运算结果,命令替换允许你执行一个命令(或函数),并将输出赋值给一个变量。管道符bc表示将字符串进行数学计算
实现指定分割文件块大小
去除ffmpeg的执行信息
#!/bin/bash
convert_to_mb() {
local size="$1"
local unit="$2"
case "$unit" in
-MB)
echo "$size"
;;
-GB)
echo "$(echo "$size * 1024" | bc)"
;;
-B)
echo "$(echo "$size / 1024 / 1024" | bc)"
;;
*)
echo "无效的单位: $unit"
exit 1
;;
esac
}
split_video() {
local video_path="$1"
local chunk_size_mb="$2"
local video_name=$(basename "$video_path")
local video_dir=$(dirname "$video_path")
local video_base="${video_name%.*}"
local output_dir="$video_dir/$video_base"
# 创建输出文件夹
mkdir -p "$output_dir"
# 获取视频时长
local total_time=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$video_path")
# 获取视频大小
local video_size_mb=$(du -BM "$video_path" | cut -f1 | tr -d 'M')
# 检查文件大小是否小于指定的切割大小
if (( video_size_mb < chunk_size_mb )); then
echo "文件大小 ($video_size_mb MB) 小于指定的切割大小 ($chunk_size_mb MB),退出。"
exit 1
fi
local child_num=$(echo "$video_size_mb / $chunk_size_mb" | bc)
local child_time=$(echo "$total_time / $child_num" | bc -l)
# 分割视频
for ((i=0; i<child_num; i++)); do
start_time=$(echo "$i * $child_time" | bc -l)
output_path="$output_dir/${video_base}_$((i + 1)).${video_name##*.}"
# 使用 -t 选项进行视频分割
ffmpeg -i "$video_path" -ss "$start_time" -t "$child_time" -c copy "$output_path" -y
done
read -p "所有视频片段已创建于 $output_dir. 是否删除原文件 $video_path? (y/n): " confirm_delete
if [[ "$confirm_delete" == "y" ]]; then
rm "$video_path"
echo "已删除 $video_path"
else
echo "未删除 $video_path"
fi
}
if [ "$#" -ne 3 ]; then
echo "用法: $0 <视频文件路径> <分割文件大小> -B|-GB|-MB"
exit 1
fi
video_file="$1"
if [ ! -f "$video_file" ]; then
echo "文件 $video_file 不存在"
exit 1
fi
chunk_size="$2"
unit="$3"
chunk_size_mb=$(convert_to_mb "$chunk_size" "$unit")
if [ "$chunk_size_mb" -lt 1 ]; then
echo "最小分割大小:1MB"
exit 1
fi
split_video "$video_file" "$chunk_size_mb"
原文地址:https://blog.csdn.net/2401_83810334/article/details/142834839
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!