FFmpeg 480p 转码失败但 1080p/720p 正常的坑
前言最近在开发一个 B 站视频项目时遇到了一个诡异的问题视频转码功能里1080p 和 720p 都能稳定正常转码唯独 480p 持续转码失败。排查了很久才找到根因今天把这个问题、分析过程和最终解决方案完整记录下来帮大家避开这个 FFmpeg 坑。问题描述项目的视频处理系统需要用 FFmpeg 将用户上传的视频转码为 HLS 流媒体格式同时生成三种分辨率的版本✅ 1080p (1920x1080) —— 转码完全正常✅ 720p (1280x720) —— 转码完全正常❌ 480p (854x480) —— 转码直接失败故障表现转码进程异常退出FFmpeg 日志没有打印明确的错误原因只能定位到 480p 转码命令执行失败。代码分析先看项目中核心的 FFmpeg 转码工具类代码问题就藏在这里java运行// FFmpegUtils.java public boolean transcodeToHLS(String inputPath, String outputDir, String playlistName, int width, int height) { ProcessBuilder builder new ProcessBuilder( ffmpeg, -i, inputPath, // 问题核心代码 -vf, scale width :-2, -c:v, libx264, -preset, fast, -b:v, 2000k, -c:a, aac, -b:a, 128k, -hls_time, 10, -hls_list_size, 0, -hls_segment_filename, outputDir File.separator %03d.ts, -y, m3u8Path ); }执行 480p 转码时scale参数会拼接成scale854:-2这就是失败的导火索。深入分析问题的根本原因1.-2参数的隐藏陷阱FFmpeg 的scale宽度:-2语法中-2表示自动计算高度且高度必须是 2 的倍数。这个设计是为了适配 x264 编码器对视频尺寸的偶数要求但它不会保持视频原始宽高比也不会做比例校验。当源视频和目标分辨率比例不匹配时自动计算的高度会偏离预期直接导致转码异常。2. 缺少关键的宽高比保护逻辑对比项目中另一个正常运行的 PowerShell 转码脚本能一眼看出差距powershell# 正常可用的缩放参数 scalew$($q.scale):force_original_aspect_ratiodecrease # 480p对应参数scalew854:480:force_original_aspect_ratiodecrease而 Java 代码里只用了scale854:-2缺失两个核心配置没有显式指定目标高度480没有添加force_original_aspect_ratiodecrease保持原始宽高比。3. 为什么偏偏 480p 会出问题这是 480p 分辨率的特殊性导致的表格分辨率宽度高度比例特性1080p19201080标准 16:9兼容性拉满720p1280720标准 16:9极少异常480p854480非标准 16:9兼容性极差标准 480p 是 640x480而常用的 854x480 是适配 16:9 的非标分辨率。一旦源视频是竖屏、宽银幕、非标比例-2自动计算的高度就会完全错乱直接触发转码失败。解决方案只需要修改 FFmpeg 的 scale 滤镜参数就能彻底解决问题。修复后的代码java运行// 原错误写法 -vf, scale width :-2 // 修复后写法推荐 -vf, scalew width :h height :force_original_aspect_ratiodecrease保守兼容写法java运行-vf, scalew854:h480:force_original_aspect_ratiodecrease参数核心解释w854强制视频宽度为 854h480强制视频高度为 480force_original_aspect_ratiodecrease保持原始宽高比只缩小不放大彻底避免视频拉伸、变形、尺寸异常。修改后重新执行转码480p、720p、1080p 全部正常输出无任何异常。总结这个问题本质是FFmpeg scale 滤镜参数使用不规范导致的。scale宽度:-2是一个 “偷懒写法”在标准 16:9 的 1080p/720p 下能侥幸运行但在非标 480p 分辨率下会直接暴露缺陷。核心经验总结视频缩放必须显式指定宽高不要依赖-2自动计算避免尺寸错乱强制保留原始宽高比必加force_original_aspect_ratiodecrease防止视频拉伸480p 需特殊处理854x480 是非标分辨率转码时一定要做严格的比例校验。如果你也在做视频转码相关开发遇到高低分辨率正常、唯独 480p 失败的情况优先检查scale参数90% 的概率是这个问题相关技术Java | FFmpeg | HLS | 视频转码 | 流媒体开发