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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:19:31