在使用 concat 组合视频时,有没有办法重置视频的旋转标志?

在使用 concat 组合视频时,有没有办法重置视频的旋转标志?

如标题所示。我正在通过 ffmpeg python 库编写一个非章节化脚本,并且我已经设置了一个非常基本的脚本来连接多个文件。这是我目前所拥有的:

if (os.path.isfile(i)):
        continue
    with open('merge_list.txt', 'w') as file:
        file.write('\n'.join([f"""file '{path}\{x}'""" for x in filelist[i]]))
    
    ffmpeg.input('merge_list.txt', format='concat', safe=False).output(i, c='copy').run()

一切运行正常,没有任何问题,但我发现,通过这个连接操作,旋转标志不知何故仍然保留(为什么会发生这种情况?如果两个视频中有一个有旋转标志,哪个标志会保留在最终视频中?)。无论哪种方式,我希望重置最终视频的旋转标志或重置各个视频的旋转标志。我主要想看看这是否可以在一次操作中完成,而不是两次;这可能吗?

谢谢!

答案1

要删除旋转元数据,请-metadata:s:v:0 rotate=0在后添加-c copy

Python 语法为:

ffmpeg.input('merge_list.txt', format='concat', safe=False).output('concatenated.mp4', c='copy', **{'metadata:s:v:0': 'rotate=0'}).run()

注意:设置rotate=0与删除旋转元数据相同。


测试:

创建 3 个合成形态,vid2.mp4标记为旋转 90 度:

ffmpeg -y -f lavfi -i testsrc=s=192x108:r=1:d=5 vid1.mp4
ffmpeg -y -i vid1.mp4 -c copy -metadata:s:v:0 rotate=90 vid2.mp4
ffmpeg -y -f lavfi -i testsrc=s=192x108:r=1:d=5 vid3.mp4

创建merge_list.txt包含以下内容的文件:

ffconcat version 1.0
file vid2.mp4
file vid1.mp4
file vid3.mp4

注意:默认情况下,FFmpeg 从第一个文件复制旋转元数据。

连接文件而不设置rotate=0

ffmpeg -y -f concat -safe 0 -i merge_list.txt -c copy merged.mp4

merged.mp4视频旋转90度播放:
在此处输入图片描述

使用相同命令rotate=0

ffmpeg -y -f concat -safe 0 -i merge_list.txt -c copy -metadata:s:v:0 rotate=0 merged2.mp4

merged2.mp4视频播放时不旋转:
在此处输入图片描述

相关内容