Skip to content

转码与压缩 ​

视频转码是将视频从一种编码格式转换为另一种格式的过程,常用于压缩文件大小、提高兼容性或优化播放性能。

HEVC 转 H.264 ​

将 HEVC(H.265)编码的视频转换为 H.264 编码,提高兼容性。

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow -c:a copy output.mp4

参数说明 ​

  • -c:v libx264: 视频编码格式为 H.264
  • -crf 18: 恒定质量因子,值越小质量越高(18-28 为合理范围)
  • -preset slow: 编码速度预设(ultrafast → veryslow,越慢质量越好)
  • -c:a copy: 音频直接复制,不重新编码

视频压缩 ​

在保证画质的前提下压缩视频文件大小。

基础压缩命令 ​

bash
ffmpeg -i input.mp4 -vcodec libx264 -crf 23 -preset slow -acodec aac -b:a 128k output.mp4

参数详解 ​

参数说明推荐值
-vcodec libx264视频编码格式(H.264)libx264
-crf恒定质量因子(0-51)18-23(越小越清晰)
-preset编码速度预设slow / veryslow(质量优先)
-acodec aac音频编码格式aac
-b:a音频比特率128k(可调高提高音质)

CRF 值选择指南 ​

CRF 值质量适用场景
18-20极高存档、专业用途
21-23高高质量视频、推荐值
24-28中等平衡质量和大小
29+低低质量、文件很小

Preset 选择指南 ​

Preset速度压缩率适用场景
ultrafast最快最低快速预览
superfast很快较低快速转码
veryfast快较低日常使用
faster较快中等平衡选择
fast快中等平衡选择
medium中等中等默认值
slow慢较高推荐
slower很慢高高质量
veryslow极慢最高极限压缩

质量与文件大小平衡 ​

  • 极限画质保留:-crf 18 + -preset veryslow
  • 平衡选择:-crf 23 + -preset slow(推荐)
  • 快速压缩:-crf 23 + -preset medium

机器转码 ​

自动化转码配置,适用于服务器批量处理。

bash
ffmpeg -y -i http://example.com/video.mov \
  -c:a copy \
  -c:v libx264 \
  -vf scale=-1:-1,format=yuv420p \
  -profile:v high \
  output.mp4

参数说明 ​

  • -y: 自动覆盖输出文件
  • -vf scale=-1:-1: 保持原始分辨率(-1 表示自动计算)
  • format=yuv420p: 设置像素格式为 yuv420p(兼容性最好)
  • -profile:v high: H.264 编码配置文件(high profile)

不同编码格式转换 ​

H.264 转 HEVC(H.265) ​

bash
ffmpeg -i input.mp4 -c:v libx265 -crf 23 -preset slow -c:a copy output.mp4

VP9 编码 ​

bash
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webm

AV1 编码(最新) ​

bash
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -b:v 0 output.mp4

硬件加速转码 ​

NVIDIA GPU 加速(NVENC) ​

bash
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -crf 23 output.mp4

Intel Quick Sync(QSV) ​

bash
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv -crf 23 output.mp4

Apple VideoToolbox(macOS) ​

bash
ffmpeg -hwaccel videotoolbox -i input.mp4 -c:v h264_videotoolbox -b:v 5M output.mp4

批量转码脚本 ​

Shell 脚本示例 ​

bash
#!/bin/bash
# 批量转码脚本

INPUT_DIR="./videos"
OUTPUT_DIR="./output"
CRF=23
PRESET="slow"

mkdir -p "$OUTPUT_DIR"

for file in "$INPUT_DIR"/*.mp4; do
    filename=$(basename "$file")
    output="$OUTPUT_DIR/${filename%.mp4}_compressed.mp4"
    
    echo "处理: $filename"
    ffmpeg -i "$file" \
        -vcodec libx264 \
        -crf "$CRF" \
        -preset "$PRESET" \
        -acodec aac \
        -b:a 128k \
        "$output"
    
    echo "完成: $output"
done

注意事项 ​

  1. CRF 值选择:

    • 18-23:高质量,适合存档
    • 23-28:平衡质量和文件大小
    • 28+:低质量,文件很小
  2. Preset 选择:

    • 时间充裕:使用 slow 或 veryslow
    • 快速处理:使用 medium 或 fast
  3. 兼容性:

    • 使用 yuv420p 像素格式确保最大兼容性
    • H.264 编码格式兼容性最好
  4. 性能优化:

    • 批量处理可以使用脚本循环
    • 大文件处理建议使用 -preset slow 或 veryslow
    • 有 GPU 的情况下使用硬件加速

下一步:学习裁剪与比例相关内容。