FFmpeg使用H.266/H.264/H.265编解码视频教程

以下是使用 FFmpeg 压缩视频的完整操作步骤,涵盖常用场景和参数优化:


1. 安装 FFmpeg

确保已安装最新版 FFmpeg(若已按此前步骤编译支持 H.266,可直接使用):
bash
复制

复制代码
sudo apt install ffmpeg  # Ubuntu/Debian
brew install ffmpeg      # macOS

2. 基础压缩命令

场景 1:通用压缩(缩小文件大小)

bash
复制

复制代码
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
  • 参数解析

    • -c:v libx264: 使用 H.264 编码器(兼容性最佳)。

    • -crf 23: 恒定质量模式(范围 0-51,值越小质量越高,建议 18-28)。

    • -preset medium: 编码速度与压缩效率的平衡(可选:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow)。

    • -c:a aac -b:a 128k: 音频编码为 AAC,码率 128kbps。

场景 2:使用 H.265(HEVC)提高压缩率

bash
复制

复制代码
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset slow -c:a aac -b:a 96k output_hevc.mp4
  • -c:v libx265: 使用 H.265 编码器(压缩率比 H.264 高 30-50%)。

  • -crf 28: HEVC 的 CRF 范围与 H.264 不同,建议值 24-30。

场景 3:使用 H.266(VVC)极致压缩

bash
复制

复制代码
ffmpeg -i input.mp4 -c:v libvvenc -qp 32 -preset medium -c:a copy output_vvc.mp4
  • 前提 :已按此前步骤编译支持 libvvenc

  • -qp 32: VVC 的量化参数(类似 CRF,值越小质量越高)。

  • -c:a copy: 直接复制原始音频(避免重复编码)。


3. 调整分辨率与帧率

降低分辨率(适合移动端)

bash
复制

复制代码
ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:v libx264 -crf 23 -preset fast output_720p.mp4
  • scale=1280:-2: 将宽度缩放到 1280px,高度按比例自适应(保持偶数)。

  • 支持的分辨率:640x360(360p)、1280x720(720p)、1920x1080(1080p)。

限制帧率(减少动态模糊)

bash
复制

复制代码
ffmpeg -i input.mp4 -r 24 -c:v libx264 -crf 23 output_24fps.mp4
  • -r 24: 强制输出帧率为 24fps(原始帧率高于此值时生效)。

4. 音频处理

去除音频

bash
复制

复制代码
ffmpeg -i input.mp4 -an -c:v libx264 -crf 23 output_no_audio.mp4
  • -an: 禁用音频流。
压缩音频质量

bash
复制

复制代码
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a libopus -b:a 64k output_opus.mp4
  • -c:a libopus: 使用 Opus 编码器(低码率高音质)。

  • -b:a 64k: 音频码率 64kbps(适合语音)。


5. 批量压缩脚本

保存以下内容为 compress.sh,批量处理当前目录下所有 .mp4 文件:
bash
复制

复制代码
#!/bin/bash
for file in *.mp4; do
  ffmpeg -i "$file" -c:v libx265 -crf 28 -preset fast -c:a aac -b:a 96k "compressed_${file}"
done

运行脚本:
bash
复制

复制代码
chmod +x compress.sh
./compress.sh

6. 验证压缩结果

检查输出文件信息

bash
复制

复制代码
ffprobe output.mp4
对比文件大小和画质
  • 用播放器(如 VLC)主观观察画质差异。

  • 使用工具(如 psnrssim)客观评估质量:

    bash
    复制

    复制代码
    ffmpeg -i input.mp4 -i output.mp4 -lavfi "ssim" -f null -

注意事项

  1. 编码速度 vs 压缩率

    • -preset 参数控制编码速度,veryslow 压缩率最高但速度最慢,适合离线处理。

    • ultrafast 速度最快但压缩率低,适合实时场景。

  2. 硬件加速(如有 NVIDIA GPU):

    bash
    复制

    复制代码
    ffmpeg -i input.mp4 -c:v h264_nvenc -preset p7 -cq 23 -c:a copy output_gpu.mp4
    • 使用 h264_nvenc(NVIDIA)或 h264_videotoolbox(macOS)。
  3. 版权与格式兼容性

    • H.265/H.266 可能涉及专利授权,商业用途需谨慎。

    • 确保目标设备支持所选编码格式(如旧设备可能不支持 H.265)。

  4. 二次编码优化

    对于高精度需求,可先提取视频信息再二次编码:

    bash
    复制

    复制代码
    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -pass 1 -f mp4 /dev/null
    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -pass 2 output.mp4

总结

通过调整编码器(H.264/H.265/H.266)、分辨率、码率等参数,可灵活平衡视频质量和文件大小。首次建议使用 libx264 -crf 23 -preset medium 作为基准配置,逐步根据需求优化。若需极致压缩,可尝试 H.266(需自行编译 FFmpeg 支持)。

相关推荐
urhero6 小时前
Python+ffmpeg 实现给视频添加字幕
ffmpeg·音视频·python编程·视频编辑·实用视频工具·添加字幕
追随远方10 小时前
Android NDK版本迭代与FFmpeg交叉编译完全指南
android·ffmpeg
带鱼工作室10 小时前
ffmpeg多媒体(音视频)处理常用命令
ffmpeg·音视频
批量小王子1 天前
2025-05-07-FFmpeg视频裁剪(尺寸调整,画面比例不变)
ffmpeg·音视频
人间花木2 天前
1. 视频基础知识
c++·ffmpeg·音视频·视频基础知识
追随远方3 天前
详解 FFMPEG 交叉编译 `FLAGS` 和 `INCLUDES` 的作用
android·ffmpeg·myeclipse·音频编解码
LDM>W<4 天前
Easy云盘总结篇-文件上传01
java·spring boot·学习·ffmpeg
RIKI_15 天前
【浅学】Windows下ffmpeg+nginx+flv将本地视频推流在本地搭建的Web前端页面中播放,超详细步骤
windows·nginx·ffmpeg·html
hunandede5 天前
AVFormatContext 再分析零
ffmpeg
hunandede5 天前
AVInputFormat 再分析
ffmpeg