自学内容网 自学内容网

脚本增加选项,解决问题

切分的视频文件名带引号
原因是拼接的输出文件后缀为(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)!