#!/bin/bash # 检查是否提供了视频文件名参数 if [ -z "$1" ]; then echo "使用方法: ./clip_and_merge.sh input_video.mp4" exit 1 fi input_video="$1" # 检查是否安装了ffmpeg if ! command -v ffmpeg &> /dev/null; then echo "ffmpeg 未安装。请安装后再运行此脚本。" exit 1 fi # 提取原视频文件名(不含扩展名) base_name=$(basename "$input_video" .mp4) # 初始化片段列表 segments=() count=1 # 提示用户输入时间码 echo "请输入起止时间码(格式: HH:MM:SS,例如 00:01:30)。输入#结束输入:" while true; do # 输入起始时间码 read -p "请输入第 $count 段的起始时间码: " start_time if [[ $start_time == "#" ]]; then break fi # 输入结束时间码 read -p "请输入第 $count 段的结束时间码: " end_time if [[ $end_time == "#" ]]; then break fi # 生成片段文件名 segment_file="segment_$count.mp4" segments+=("$segment_file") # 使用 ffmpeg 截取片段 ffmpeg -i "$input_video" -ss "$start_time" -to "$end_time" -c:v copy -c:a copy "$segment_file" echo "片段 $count 已保存为 $segment_file" count=$((count + 1)) done # 检查是否有生成的片段 if [ ${#segments[@]} -eq 0 ]; then echo "未输入任何片段,脚本结束。" exit 1 fi # 创建一个文本文件,包含所有片段的路径 concat_file="concat_list.txt" > "$concat_file" for segment in "${segments[@]}"; do echo "file '$segment'" >> "$concat_file" done # 生成最终合并文件名 output_file="${base_name}_clip_and_merge.mp4" # 合并所有片段 ffmpeg -f concat -safe 0 -i "$concat_file" -c:v copy -c:a copy "$output_file" echo "所有片段已合并为 $output_file" # 删除过程文件 rm "$concat_file" for segment in "${segments[@]}"; do rm "$segment" done echo "过程文件已删除,仅保留最终输出文件 $output_file"