使用 FFmpeg 实现视频格式的批量转换
批量视频格式转换是多媒体处理中的常见任务。面对大量视频文件,手动操作效率低且容易出错。作为开发者或媒体工程师,借助 FFmpeg 实现自动化转换,是构建高效处理流程的关键。
本文将介绍如何使用 FFmpeg 快速进行视频格式的批量转换,并提供适用于 Windows 和 macOS/Linux 的完整脚本示例,帮助你构建专业、可复用的视频处理流水线。
若你尚未了解 FFmpeg 的基础用法,请先阅读 FFmpeg 简介。
一、快速上手:单文件转换基础
在进行批量处理前,先掌握 FFmpeg 的基本用法:
ffmpeg -i 输入文件 [转换参数] 输出文件
例如,将一个 .avi
文件转换为 .mp4
格式:
ffmpeg -i input.avi output.mp4
FFmpeg 会自动选择合适的视频和音频编码器。更复杂的转换参数将在后文详述。
二、批量转换脚本实战
⚠️ filethings.net 提醒您 在批量处理前务必备份原始文件。尽管 FFmpeg 非常稳定,但转换过程中仍可能出现意外。建议先在少量样本文件上测试脚本,确保命令参数无误后再大规模执行。
2.1 Windows 批处理脚本(.bat
)
创建文件 batch_convert.bat
并粘贴以下内容:
@echo off
setlocal enabledelayedexpansion
:: FFmpeg 批量转换脚本 - Windows 版
:: 用法: batch_convert.bat [目录] [输入格式] [输出格式]
set "video_dir=%~1"
set "input_ext=%~2"
set "output_ext=%~3"
if "%video_dir%"=="" set "video_dir=%cd%"
if "%input_ext%"=="" set "input_ext=avi"
if "%output_ext%"=="" set "output_ext=mp4"
echo 🚀 启动批量转换
echo 📁 目录: %video_dir%
echo 📝 格式: %input_ext% → %output_ext%
echo.
set "success_count=0"
set "fail_count=0"
set "total_count=0"
for %%i in ("%video_dir%\*.%input_ext%") do (
set /a total_count+=1
)
if %total_count%==0 (
echo ❌ 未找到 .%input_ext% 文件
pause
exit /b 1
)
for %%i in ("%video_dir%\*.%input_ext%") do (
echo 🔄 正在处理: %%~nxi
ffmpeg -hide_banner -loglevel error -i "%%i" -c:v libx264 -preset medium -crf 23 -c:a aac "%%~dpni.%output_ext%"
if !ERRORLEVEL! EQU 0 (
echo ✅ 成功: %%~ni.%output_ext%
set /a success_count+=1
) else (
echo ❌ 失败: %%~nxi
set /a fail_count+=1
)
)
echo.
echo 📊 转换结果:
echo ✅ 成功: %success_count%
echo ❌ 失败: %fail_count%
if %fail_count% GTR 0 (
echo ⚠️ 请检查失败文件格式或完整性
)
pause
2.2 macOS/Linux Shell 脚本(.sh
)
保存为 batch_convert.sh
并赋予执行权限:
chmod +x batch_convert.sh
脚本内容如下:
#!/bin/bash
# FFmpeg 批量视频转换脚本 - macOS/Linux 版
set -euo pipefail
VIDEO_DIR="${1:-$(pwd)}"
INPUT_EXT="${2:-avi}"
OUTPUT_EXT="${3:-mp4}"
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
echo -e "${BLUE}🚀 启动批量转换${NC}"
echo -e "📁 目录: $VIDEO_DIR"
echo -e "📝 格式: $INPUT_EXT → $OUTPUT_EXT"
echo
if [ ! -d "$VIDEO_DIR" ]( ! -d "$VIDEO_DIR" ); then
echo -e "${RED}❌ 目录不存在: $VIDEO_DIR${NC}"
exit 1
fi
mapfile -t FILES < <(find "$VIDEO_DIR" -name "*.${INPUT_EXT}" -type f)
TOTAL=${#FILES[@]}
if [ $TOTAL -eq 0 ]( $TOTAL -eq 0 ); then
echo -e "${RED}❌ 未找到 .${INPUT_EXT} 文件${NC}"
exit 1
fi
SUCCESS=0; FAILED=0; SKIPPED=0
for FILE in "${FILES[@]}"; do
OUTPUT="${FILE%.*}.${OUTPUT_EXT}"
BASENAME=$(basename "$FILE")
if [ -f "$OUTPUT" ]( -f "$OUTPUT" ); then
echo -e "${YELLOW}⏭️ 已存在,跳过: $BASENAME${NC}"
((SKIPPED++))
continue
fi
echo -e "${YELLOW}🔄 处理: $BASENAME${NC}"
if ffmpeg -hide_banner -loglevel error -i "$FILE" -c:v libx264 -preset medium -crf 23 -c:a aac "$OUTPUT"; then
echo -e "${GREEN} ✅ 成功: $(basename "$OUTPUT")${NC}"
((SUCCESS++))
else
echo -e "${RED} ❌ 失败: $BASENAME${NC}"
((FAILED++))
fi
done
echo
echo -e "${BLUE}📊 转换统计${NC}"
echo -e " ${GREEN}✅ 成功: $SUCCESS${NC}"
echo -e " ${RED}❌ 失败: $FAILED${NC}"
echo -e " ${YELLOW}⏭️ 跳过: $SKIPPED${NC}"
[ $FAILED -gt 0 ]( $FAILED -gt 0 ) && echo -e "${RED}⚠️ 请检查失败文件${NC}"
echo -e "${GREEN}🎉 所有任务完成${NC}"
三、常用参数说明与质量控制
3.1 视频质量与文件大小
使用 -crf
控制输出视频质量,取值范围 0–51,数值越低质量越高。
场景 | 示例 | 说明 |
---|---|---|
高质量 | -crf 18 | 接近无损,文件较大 |
平衡 | -crf 23 | 默认推荐 |
低质量 | -crf 28 | 适合网络传输 |
3.2 音频设置参考
参数 | 作用 |
---|---|
-ar | 音频采样率(Hz) |
-b:a | 音频比特率(如 128k ) |
# 标准配置(CD音质)
ffmpeg -i input.avi -c:v libx264 -crf 23 -ar 44100 -b:a 128k output.mp4
四、常见格式转换示例
来源格式 | 目标格式 | 命令示例 |
---|---|---|
MP4 → FLV | ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.flv | |
MOV → MP4 | ffmpeg -i input.mov -c:v libx264 -c:a aac -crf 23 output.mp4 | |
AVI → WebM | ffmpeg -i input.avi -c:v libvpx-vp9 -crf 30 -b:v 1M -c:a libopus output.webm |
五、高效自动化技巧
5.1 性能优化建议
- 使用
-preset faster
提升编码速度 - 低分辨率转码:
-s 1280x720
- 多核并行:结合
xargs -P
或GNU parallel
5.2 自动化集成
- 定时执行:Windows 计划任务 /
cron
- 实时转换:结合
inotifywait
或fswatch
- Webhook 接入:自动处理上传视频
- 保留元数据:添加
-map_metadata 0
六、故障排查与常见问题
问题 | 原因与解决方案 |
---|---|
转换速度慢 | 使用 -preset fast ,降低分辨率 |
音频不同步 | 添加 -async 1 |
Invalid data found 错误 | 输入文件异常,尝试添加 -fflags +genpts |
七、命令速查表
任务 | 示例命令 |
---|---|
AVI 转 MP4 | ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4 |
查看视频信息 | ffprobe input.mp4 |
自动覆盖输出 | 添加 -y |
静默模式 | 添加 -hide_banner -loglevel error |
八、结语:打造你的视频处理流水线
掌握 FFmpeg 的批量处理技巧后,你将不再被海量视频转换困扰。无论是个人整理视频素材,还是团队构建媒体处理系统,本文提供的工具和脚本都可作为稳定高效的起点。