使用FFmpeg Python库进行concat拼接时,如何重置视频的rotation flag?
使用FFmpeg Python库进行concat拼接时,如何重置视频的rotation flag?
首先先解答你关于concat时旋转flag的疑问:FFmpeg的concat demuxer在直接复制流(c='copy')的时候,会默认继承第一个输入视频文件的流元数据,包括旋转flag。所以如果你的多个输入视频有不同的旋转设置,最终输出的视频会沿用第一个文件的旋转信息——这就是为什么你发现旋转flag被保留了。
接下来是你关心的「一步完成拼接+重置旋转flag」的方案,分两种情况按需选择:
情况1:仅重置旋转元数据(不修改画面,快速无编码)
如果你只是想让播放器不再自动旋转视频(保留原画面像素排列,仅修改元数据),可以直接在输出时添加metadata参数强制设置旋转为0,不需要额外步骤。修改你的代码即可:
ffmpeg.input('merge_list.txt', format='concat', safe=False).output( i, c='copy', metadata=s:v:0='rotate=0' ).run()
这里metadata:s:v:0='rotate=0'的作用是给输出的第一个视频流设置旋转值为0,覆盖掉原来继承的旋转元数据,播放器就会按照正常方向播放了。
情况2:同时修正画面方向+重置元数据(需要重新编码)
如果你的原视频是通过旋转flag实现竖屏/横屏(比如画面像素是横向存储,靠旋转flag让播放器竖屏显示),你希望把画面真正旋转到正确方向,同时清除旋转flag,这时候就需要使用视频滤镜,同时放弃视频流的直接复制(因为滤镜需要重新编码视频):
# 示例:顺时针旋转90度(根据你的原旋转方向调整transpose参数) ffmpeg.input('merge_list.txt', format='concat', safe=False).output( i, vf='transpose=1', # transpose参数对应不同旋转方式,按需选择 c:a='copy' # 音频仍然可以直接复制,不需要编码 ).run()
常用的transpose参数对应效果:
transpose=0:逆时针旋转90度+垂直翻转transpose=1:顺时针旋转90度transpose=2:逆时针旋转90度transpose=3:顺时针旋转90度+垂直翻转
这样处理后,输出视频的画面已经是正确方向,旋转flag也会被清除。
备注:内容来源于stack exchange,提问作者Daneolog
相关产品推荐
相关产品推荐

