ffmpeg把视频转换及分割多个部分 - 手记
#!/bin/bash
# 找到当前目录及子目录中的所有 MKV 文件
mkv_files=$(find . -type f -name "*.mkv")
# 循环处理每个 MKV 文件
for file in $mkv_files; do
# 构建输出的 MP4 文件名
mp4_file="${file%.mkv}.mp4"
# 使用 FFmpeg 将 MKV 转换成 MP4
ffmpeg -i "$file" -c:v copy -c:a copy "$mp4_file"
# 删除原始的 MKV 文件
rm "$file"
done接着执行分割脚本
先安装bc
apt-get install bc分成五个部分
新建sh脚本
total_duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 1.mp4)
segment_duration=$(echo "$total_duration / 5" | bc -l)
ffmpeg -i 1.mp4 -t $segment_duration -c:v copy -c:a copy part1.mp4
ffmpeg -ss $segment_duration -i 1.mp4 -t $segment_duration -c:v copy -c:a copy part2.mp4
ffmpeg -ss $(echo "2 * $segment_duration" | bc -l) -i 1.mp4 -t $segment_duration -c:v copy -c:a copy part3.mp4
ffmpeg -ss $(echo "3 * $segment_duration" | bc -l) -i 1.mp4 -t $segment_duration -c:v copy -c:a copy part4.mp4
ffmpeg -ss $(echo "4 * $segment_duration" | bc -l) -i 1.mp4 -c:v copy -c:a copy part5.mp4分成六个部分
新建sh脚本
total_duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 1.mp4)
segment_duration=$(echo "$total_duration / 6" | bc -l)
ffmpeg -i 1.mp4 -t $segment_duration -c:v copy -c:a copy part1.mp4
ffmpeg -ss $segment_duration -i 1.mp4 -t $segment_duration -c:v copy -c:a copy part2.mp4
ffmpeg -ss $(echo "2 * $segment_duration" | bc -l) -i 1.mp4 -t $segment_duration -c:v copy -c:a copy part3.mp4
ffmpeg -ss $(echo "3 * $segment_duration" | bc -l) -i 1.mp4 -t $segment_duration -c:v copy -c:a copy part4.mp4
ffmpeg -ss $(echo "4 * $segment_duration" | bc -l) -i 1.mp4 -t $segment_duration -c:v copy -c:a copy part5.mp4
ffmpeg -ss $(echo "5 * $segment_duration" | bc -l) -i 1.mp4 -c:v copy -c:a copy part6.mp4
把当前目录及子目录下大于2000000000byte的mp4文件平均分割成五个部分后,删除源文件
#!/bin/bash
# 找到当前目录及子目录中大于等于2GB的MP4文件
mp4_files=$(find . -type f -name "*.mp4" -size +2000000000c)
# 循环处理每个满足条件的MP4文件
for file in $mp4_files; do
file_dir=$(dirname "$file") # 获取原文件所在的目录
filename=$(basename "$file" .mp4)
duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
segment_duration=$(echo "$duration / 5" | bc -l)
# 创建一个临时目录来存放分割后的部分
temp_dir=$(mktemp -d)
ffmpeg -i "$file" -t $segment_duration -c:v copy -c:a copy "$temp_dir/${filename}_part1.mp4"
ffmpeg -ss $segment_duration -i "$file" -t $segment_duration -c:v copy -c:a copy "$temp_dir/${filename}_part2.mp4"
ffmpeg -ss $(echo "2 * $segment_duration" | bc -l) -i "$file" -t $segment_duration -c:v copy -c:a copy "$temp_dir/${filename}_part3.mp4"
ffmpeg -ss $(echo "3 * $segment_duration" | bc -l) -i "$file" -t $segment_duration -c:v copy -c:a copy "$temp_dir/${filename}_part4.mp4"
ffmpeg -ss $(echo "4 * $segment_duration" | bc -l) -i "$file" -c:v copy -c:a copy "$temp_dir/${filename}_part5.mp4"
# 删除源文件
rm "$file"
# 移动分割后的部分到原文件所在目录
mv "$temp_dir"/* "$file_dir"
# 删除临时目录
rmdir "$temp_dir"
done
###仅对当前目录中大小大于2GB(2000000000字节)的MP4文件执行分割两个部分操作
#!/bin/bash
# 获取当前目录下大于2GB的MP4文件
mp4_files=$(find . -maxdepth 1 -type f -name "*.mp4" -size +2000000000c)
# 循环处理每个满足条件的MP4文件
for file in $mp4_files; do
filename=$(basename "$file" .mp4)
duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
segment_duration=$(echo "$duration / 2" | bc -l)
ffmpeg -i "$file" -t $segment_duration -c:v copy -c:a copy "${filename}_part1.mp4"
ffmpeg -ss $segment_duration -i "$file" -t $segment_duration -c:v copy -c:a copy "${filename}_part2.mp4"
done