使用 FFmpeg 实现视频格式的批量转换

批量视频格式转换是多媒体处理中的常见任务。面对大量视频文件,手动操作效率低且容易出错。作为开发者或媒体工程师,借助 FFmpeg 实现自动化转换,是构建高效处理流程的关键。

本文将介绍如何使用 FFmpeg 快速进行视频格式的批量转换,并提供适用于 WindowsmacOS/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 → FLVffmpeg -i input.mp4 -c:v libx264 -crf 23 output.flv
MOV → MP4ffmpeg -i input.mov -c:v libx264 -c:a aac -crf 23 output.mp4
AVI → WebMffmpeg -i input.avi -c:v libvpx-vp9 -crf 30 -b:v 1M -c:a libopus output.webm

五、高效自动化技巧

5.1 性能优化建议

5.2 自动化集成

六、故障排查与常见问题

问题原因与解决方案
转换速度慢使用 -preset fast,降低分辨率
音频不同步添加 -async 1
Invalid data found 错误输入文件异常,尝试添加 -fflags +genpts

七、命令速查表

任务示例命令
AVI 转 MP4ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4
查看视频信息ffprobe input.mp4
自动覆盖输出添加 -y
静默模式添加 -hide_banner -loglevel error

八、结语:打造你的视频处理流水线

掌握 FFmpeg 的批量处理技巧后,你将不再被海量视频转换困扰。无论是个人整理视频素材,还是团队构建媒体处理系统,本文提供的工具和脚本都可作为稳定高效的起点。