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

Flutter FFMPEG拼接摄像头录制视频时旋转异常问题

解决Flutter Camera录制视频拼接后倒置的问题

问题原因

手机前置/后置摄像头录制的视频会携带旋转元数据(比如前置视频可能标记rotate=270,对应-90度),单独播放时系统播放器会读取这个元数据自动旋转画面,但用FFmpeg的concat命令+-c:v copy(直接复用视频流)时,只会继承第一个视频的旋转元数据,后续视频的实际画面没有被旋转,导致拼接后显示异常。你之前用的-display_rotation是FFplay的播放参数,不是FFmpeg的编码参数,所以无法修改视频本身。

解决方案

1. 先统一所有视频的画面方向(推荐,速度快)

先处理带旋转元数据的视频,把画面实际旋转过来,同时清除旋转元数据,再拼接:

  • 第一步:检查视频的旋转元数据,确认需要旋转的角度

    ffprobe -v error -select_streams v:0 -show_entries stream_tags=rotate -of default=noprint_wrappers=1:nokey=1 [你的视频文件名].mp4
    

    比如前置视频会返回270(对应-90度倒置),后置视频返回0。

  • 第二步:处理前置视频,将画面旋转并清除元数据
    如果是270度(-90),用逆时针旋转90度的滤镜:

    ffmpeg -y -i record-1709022976601.mp4 -vf "transpose=2" -metadata:s:v:0 rotate=0 -c:a copy fixed-record-1709022976601.mp4
    
    • transpose=2:逆时针旋转90度(对应抵消270的元数据旋转)
    • metadata:s:v:0 rotate=0:清除视频的旋转元数据
    • -c:a copy:直接复用音频流,避免重新编码
  • 第三步:修改拼接列表文件videosPathsTextFilePath,替换为处理后的视频路径,再执行原拼接命令:

    ffmpeg -y -f concat -i fixed-videos-list.txt -c:a aac -c:v copy fullVideoOutPath
    

2. 拼接时直接统一旋转(需重新编码,速度较慢)

如果不想单独处理视频,可以在拼接时直接对所有视频应用旋转滤镜,但需要重新编码视频流:

ffmpeg -y -f concat -i videosPathsTextFilePath -vf "rotate='if(eq(rot,270), 90*PI/180, 0)'" -c:a aac -c:v libx264 fullVideoOutPath

这个命令会自动检测视频的旋转元数据,对标记270度的视频旋转90度,其他视频保持原样。

内容的提问来源于stack exchange,提问作者ibrahim Eltayfe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:02:33