基于输入分辨率使用ffmpeg自动调整视频尺寸
解决方案:批量适配不同分辨率的视频缩放脚本
我之前做过类似的批量视频处理任务,刚好能解决你的需求——针对不同分辨率的视频自动匹配缩放比例,下面是完整的实现思路和可直接用的脚本:
核心思路
- 遍历目标目录下的所有视频文件
- 用
ffprobe(ffmpeg配套工具)提取每个视频的分辨率 - 判断分辨率类型:
- 1280×720 → 缩放到640×360(等比例缩小一半)
- 720×1280 → 缩放到360×640(同样等比例缩小一半)
- 调用
ffmpeg执行缩放,同时保留原音频编码节省时间
完整Bash脚本
#!/bin/bash # 目标视频目录(可以改成你需要的路径,比如./videos) VIDEO_DIR="./" # 输出目录(自动创建,避免覆盖原文件) OUTPUT_DIR="./scaled_videos" mkdir -p "$OUTPUT_DIR" # 检查ffmpeg和ffprobe是否安装 if ! command -v ffmpeg &> /dev/null || ! command -v ffprobe &> /dev/null; then echo "错误:请先安装ffmpeg和ffprobe工具!" exit 1 fi # 遍历目录下的常见视频格式(可根据需要添加,比如.mov .flv等) for file in "$VIDEO_DIR"/*.{mp4,mkv,avi,webm}; do # 跳过不存在的文件(比如目录里没有avi格式时的空匹配) [ -f "$file" ] || continue # 获取文件名(不含路径) filename=$(basename "$file") # 输出文件路径 output_file="$OUTPUT_DIR/scaled_$filename" # 用ffprobe提取视频分辨率,输出格式为"宽x高"(比如1280x720) resolution=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$file") # 拆分宽和高 IFS=x read -r width height <<< "$resolution" # 根据分辨率执行不同的缩放逻辑 if [ "$width" -eq 1280 ] && [ "$height" -eq 720 ]; then echo "处理文件:$filename → 缩放至640×360" ffmpeg -i "$file" -vf "scale=640:360" -c:a copy -y "$output_file" elif [ "$width" -eq 720 ] && [ "$height" -eq 1280 ]; then echo "处理文件:$filename → 缩放至360×640" ffmpeg -i "$file" -vf "scale=360:640" -c:a copy -y "$output_file" else echo "跳过文件:$filename,分辨率$resolution不在处理范围内" fi done echo "所有文件处理完成!输出文件在$OUTPUT_DIR目录下"
关键部分解释
ffprobe提取分辨率:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$file"-v error:只输出错误信息,屏蔽冗余日志-select_streams v:0:选择第一个视频流(避免多视频流的情况)-show_entries stream=width,height:只提取宽和高信息-of csv=s=x:p=0:用x分隔宽高,且不输出表头
ffmpeg缩放命令:
ffmpeg -i "$file" -vf "scale=640:360" -c:a copy -y "$output_file"-vf "scale=W:H":视频滤镜,指定目标宽高-c:a copy:直接复制原音频编码,不重新编码,大幅节省时间-y:自动覆盖已存在的输出文件(如果不需要可以去掉)
文件遍历与命名:用
*.{mp4,mkv,avi,webm}匹配多种视频格式,输出文件加scaled_前缀并放到单独目录,避免覆盖原文件
注意事项
- 先测试:建议先拿一两个视频文件测试脚本,确认输出符合预期后再批量处理
- 自定义格式:如果你的视频是其他格式(比如.mov),可以在
for file那行的括号里添加对应的后缀 - 编码参数:如果需要调整视频编码(比如用H.265压缩),可以在ffmpeg命令里添加
-c:v libx265 -crf 28这类参数(crf值越小画质越好,文件越大) - 空格处理:脚本里所有变量都用双引号包裹,避免文件名含空格时出错
内容的提问来源于stack exchange,提问作者Masoud92m
相关产品推荐
相关产品推荐

