From bb7172de408d7e23bc19866de277a6ee80c91850 Mon Sep 17 00:00:00 2001 From: ZevFung Date: Mon, 19 Oct 2026 12:41:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=86=E9=A2=91=E8=BD=AC=E7=A0=81?= =?UTF-8?q?=E5=90=8E=E4=BF=9D=E7=95=99=E6=97=8B=E8=BD=AC=E8=A7=92=E5=BA=A6?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=89=8B=E6=9C=BA=E7=AB=96=E5=B1=8F?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E8=BD=AC=E7=A0=81=E5=90=8E=E8=A2=AB=E6=97=8B?= =?UTF-8?q?=E8=BD=AC90=E5=BA=A6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 手机(iPhone等)拍摄的 mov 视频,旋转信息只保存在 display matrix 元数据中, JavaCV 逐帧转码时帧本身未旋转,而 FFmpegFrameRecorder 未写入该元数据, 导致转码后的 mp4 方向错误。现从 grabber 读取 displayRotation 并设置到 recorder。 Co-Authored-By: Claude Sonnet 5.5 --- .../src/main/java/cn/keking/service/Mediatomp4Service.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/main/java/cn/keking/service/Mediatomp4Service.java b/server/src/main/java/cn/keking/service/Mediatomp4Service.java index 6b1518412..6233f9aa5 100644 --- a/server/src/main/java/cn/keking/service/Mediatomp4Service.java +++ b/server/src/main/java/cn/keking/service/Mediatomp4Service.java @@ -478,6 +478,11 @@ private static void configureRecorder(FFmpegFrameRecorder recorder, recorder.setFrameRate(grabber.getFrameRate()); recorder.setSampleRate(grabber.getSampleRate()); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); + // 手机拍摄的视频旋转角度只存在元数据里,帧本身未旋转,需要原样写入输出文件 + double displayRotation = grabber.getDisplayRotation(); + if (displayRotation != 0 && !Double.isNaN(displayRotation)) { + recorder.setDisplayRotation(displayRotation); + } int videoBitrate = grabber.getVideoBitrate(); if (videoBitrate <= 0) {