ffmpeg使用实例:如何让一个1小时50分钟的40g视频变成5g,并且尽量保证画质和音质?

ffmpeg简介

计算比特率

假设你的视频时长为 1 小时 50 分钟(即 110 分钟 = 6600 秒),目标文件大小为 5GB(5GB = 5000MB,实际1GB=1024MB)

目标比特率(kbps) = (文件大小(MB) × 8192) ÷ 时长(秒)= (5120 × 8192) ÷ 6600 ≈ 6355 kbps (为了方便后续就用6000k了)

第一次编码

  • 第一遍:ffmpeg 会分析整个视频内容,记录每一帧的复杂度和运动信息,但不会生成最终文件。
ffmpeg -y -i input.mp4 -c:v libx264 -b:v 6000k -preset slow -pass 1 -an -f mp4 /dev/null
  • -y:自动覆盖已有文件
  • -i input.mp4:输入文件
  • -c:v libx264:使用 H.264 编码器
  • -b:v 6000k:视频比特率设为 6000kbps
  • -preset slow:编码速度慢,压缩率高,画质更好
  • -pass 1:第一遍编码(只做分析,不生成最终视频)
  • -an:不处理音频
  • -f mp4 /dev/null:输出格式为 mp4,但丢弃输出(/dev/null)

第二次编码

  • 第二遍:利用第一遍收集的数据,ffmpeg 能更合理地分配比特率——复杂场景分配更多码率,简单场景分配更少,从而在限定文件大小下最大化整体画质。
ffmpeg -i input.mp4 -c:v libx264 -b:v 6000k -preset slow -pass 2 -c:a aac -b:a 192k output.mp4
  • -pass 2:第二遍编码(利用第一遍分析的数据,优化码率分配)
  • -c:a aac:音频编码为 AAC
  • -b:a 192k:音频比特率 192kbps
  • output.mp4:输出文件名

调整多核并行

默认会调用最多的核来进行

你可以通过 -threads 修改核
比如第一遍编码,我们不想让10个核都跑满

ffmpeg -y -i input.mp4 -c:v libx264 -b:v 6000k -preset slow -pass 1 -an -f mp4 /dev/null

就改成

ffmpeg -y -i input.mp4 -c:v libx264 -b:v 6000k -thread 8 -preset slow -pass 1 -an -f mp4 /dev/null

更多