You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:18:33