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 选择

    • 时间充裕:使用 slowveryslow
    • 快速处理:使用 mediumfast
  3. 兼容性

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

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

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