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

相关推荐
sqmeeting4 小时前
视频编解码技术-3: H.264和VP9压缩效率和编码时延
视频编解码·h.264·vp9
IT技术分享社区6 小时前
电脑软件:推荐一款非常强大的视频音频转换剪辑工具FFmpeg Batch AV Converter V3.12
ffmpeg·音视频·batch·剪辑工具
ICUD7 小时前
FFmpeg+vvenc实现H.266的视频编解码教程
人工智能·ffmpeg·视频编解码·h.266
万里不留行9 小时前
海康摄像头 + M7s(Monibuca) + FFmpeg + Python实现多个网络摄像头视频流推流
服务器·网络·python·ffmpeg
宇宙无敌花心大萝卜20 小时前
一种简单的快速批量视频抽取固定间隔帧截图的操作方法
ffmpeg·音视频·视频
飞猿_SIR1 天前
最新版本Exoplayer(MediaX)实现K歌原伴唱包括单音轨和双音轨
android·ffmpeg·音视频
WalkingWithTheWind~2 天前
Linux搭建Nginx直播流媒体服务RTMP/RTSP转Http-flv视频浏览器在线播放/Vue/Java/ffmpeg
java·linux·nginx·ffmpeg·vue·http-flv·rtsp
深图智能2 天前
VS2022配置FFMPEG库基础教程
c++·计算机视觉·ffmpeg
cuijiecheng20183 天前
音视频入门基础:RTP专题(10)——FFmpeg源码中,解析RTP header的实现
ffmpeg·音视频