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 支持)。

相关推荐
肥肥呀呀呀8 小时前
Flutter视频播放优化
ffmpeg·音视频
CrabKA13 小时前
FFmpeg开发学习:音视频封装
学习·ffmpeg·音视频
Yeauty1 天前
Rust 与 FFmpeg 实现视频水印添加:技术解析与应用实践
rust·ffmpeg·音视频
CrabKA1 天前
FFmpeg开发学习:AVFormatContext结构体
学习·ffmpeg
小龙在山东1 天前
基于 ffmpeg 实现合并视频
ffmpeg·音视频
用户96715113916722 天前
Rust 与 FFmpeg 实现视频水印添加:技术解析与应用实践
rust·ffmpeg
byxdaz3 天前
ffmpeg+QOpenGLWidget显示视频
ffmpeg·音视频
zczlsy113 天前
ffmpeg系列(三)—— 音频重采样
ffmpeg·音视频
Yeauty4 天前
三分钟掌握音频提取 | 在 Rust 中优雅地处理视频音频
后端·rust·ffmpeg·音视频·音频·视频
码农诗人4 天前
C++调用ffmpeg解复用、解码案例
c++·ffmpeg·解码·解封装