JavaCV中FFmpegFrameFilter的transpose滤镜无法正常工作
解决JavaCV中FFmpegFrameFilter逆时针旋转90度不符合预期的问题
看起来你遇到的问题很典型——JavaCV里使用transpose滤镜时,参数行为和预期不符,核心原因大概率是没有正确处理旋转后帧的宽高尺寸,导致画面被错误拉伸,看起来像是旋转了180度而非预期的90度。
问题根源分析
原生FFmpeg的transpose参数是符合文档描述的:
transpose=2:逆时针旋转90度transpose=cclock:和transpose=2等价
但在JavaCV中创建FFmpegFrameFilter时,你需要传入滤镜输出帧的宽高,而非原视频的宽高。逆时针旋转90度后,帧的宽高会完全交换(原宽W→新高H,原高H→新宽W),如果你依然用原宽高初始化滤镜,输出帧会被强行缩放到原尺寸,导致画面扭曲,视觉上误以为是旋转了180度。
解决方案
只需调整FFmpegFrameFilter初始化时的宽高参数,将原宽高交换即可:
// 原视频宽previewWidth,高previewHeight // 逆时针旋转90度后,输出帧的宽是previewHeight,高是previewWidth FFmpegFrameFilter frameFilter = new FFmpegFrameFilter("transpose=2", previewHeight, previewWidth); frameFilter.start();
然后在帧处理循环中,正确推送原帧并拉取处理后的帧:
// 推送原始帧到滤镜 frameFilter.push(originalFrame); // 获取旋转后的帧 Frame rotatedFrame = frameFilter.pull(); // 使用rotatedFrame进行预览或后续处理
额外验证步骤
如果还是有问题,可以先通过原生FFmpeg命令验证参数是否正确,排除滤镜本身的问题:
ffmpeg -i input.mp4 -vf "transpose=2" output.mp4
打开输出视频确认是否为逆时针90度,如果原生命令正常,那回到JavaCV代码检查宽高设置和帧处理流程即可。
内容的提问来源于stack exchange,提问作者Aks4125
相关产品推荐
相关产品推荐

