如标题所示。我正在通过 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
使用相同命令rotate=0
:
ffmpeg -y -f concat -safe 0 -i merge_list.txt -c copy -metadata:s:v:0 rotate=0 merged2.mp4