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

news/2025/2/26 6:08:17

以下是使用 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 支持)。


http://www.niftyadmin.cn/n/5868146.html

相关文章

【初阶数据结构】星河中的光影 “排” 象:排序(下)

文章目录 4.交换排序4.1 冒泡排序(BubbleSort)4.2 快速排序(QuickSort)4.2.1 hoare版本4.2.2 挖坑法4.2.3 前后指针法4.2.4 非递归实现 5.归并排序(MergeSort)5.1 递归实现5.2 非递归实现5.2.1 一次性全部拷…

算法与数据结构(格雷编码)

题目 思路 首先我们先看一下格雷编码的一些情况,为了一会方便理解,我们看它的二进制情况。 当n1时,输出[0,1] 当n2时,输出[00,01,11,10] 当n3时,输出[000, 001, 011, 010, 110, 111, 101, 100] 我们可…

栅格地图路径规划:基于雪橇犬优化算法(Sled Dog Optimizer,SDO)的移动机器人路径规划(提供MATLAB代码)

一、雪橇犬优化算法 雪橇犬优化算法(Sled Dog Optimizer,SDO)是一种于2024年10月发表在JCR1区、中科院1区SCI期刊《Advanced Engineering Informatics》的仿生元启发式算法。它受雪橇犬行为模式启发,通过模拟狗拉雪橇、训练和退役…

2025考研国家线首次全面下降,涵盖与24年对比分析!

2025年研考国家线发布,“调剂意向采集系统”将于3月28日开通;“调剂服务系统”将于4月8日开通。 “中国研究生招生信息网”中“调剂意向采集系统”将于3月28日开通,已完成一志愿录取的招生单位可发布调剂信息,有调剂意愿的考生可查…

HarmonyOS 无线调试

下载sdk 找到hdc位置> C:\Users\27638\AppData\Local\OpenHarmony\Sdk\14\toolchains 不要去DevEco Studio的窗口不知道为什么调不动 hdc tconn IP:PORT

基于FastGPT搭建本地DeepSeek R1服务+AI专属知识库

在这个快速发展的AI时代,如何高效搭建本地智能系统成为了许多开发者和企业关注的焦点。为了帮助轻松搭建一个强大的本地AI服务详细介绍如何通过一键部署 LM Studio + DeepSeek R1,并搭建 AI 专属知识库。 通过这个过程可以实现对自定义数据的快速处理、无缝集成以及数据安全…

Unity中动态切换光照贴图的方法

关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…

使用 pytest-mock 进行 Python 高级单元测试与模拟

一、单元测试与模拟的意义 在软件开发中,单元测试用于验证代码逻辑的正确性。但实际项目中,代码常依赖外部服务(如数据库、API、文件系统)。直接测试这些依赖会导致: 测试速度变慢测试结果不可控产生副作用(如真实发送邮件)模拟(Mocking) 技术通过创建虚拟对象替代真…