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.mp4transpose=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
相关产品推荐
相关产品推荐

