我正在尝试从一个list.txt连接3个视频,我可以将列表中的所有视频连接在一个长视频中,但我希望将列表中的x视频连接到一个输出中,然后将来自同一列表的下一个x视频连接到另一个输出中,以此类推。
我正在开发的脚本是用python编写的,它从服务器上获取一些视频,并将它们保存在本地的一个文件夹中并编写我的concat.txt,然后ffmpeg读取concat.txt并创建一个output.mp4
#this merge all video in concat file in a single output
os.system("ffmpeg -f concat -i downloaded/concat.txt -safe 1 -r 30 -fflags +genpts -c:a copy downloaded/output.mp4")我正在寻找一种方法,使ffmpeg从concat.txt读取第一个x行,将它们连接到output1.mp4中,然后从cancat.txt读取下一个x行,在output2.mp4中连接它们等等。
谢谢你抽出时间来帮我,我真的很感激!
-编辑感谢@Tejas的回复,我解决了如何分割concat.txt文件,现在我正在尝试对每个剪辑应用一个过滤器
import os
x = 3 #Number of files you want to concatenate
#Making directories so that the working directory stays organized
txtFileName = "./splits/output{}.txt"
outputFile = "./clip/output{}.mp4"
postFile = "./media/post{}.mp4"
os.makedirs(os.path.dirname(txtFileName), exist_ok=True)
os.makedirs(os.path.dirname(outputFile), exist_ok=True)
os.makedirs(os.path.dirname(postFile), exist_ok=True)
#While splitting the files store their path to a list
listofSplitFiles = []
with open('./downloaded/concat.txt','r') as concat:
lines = concat.readlines()
for i in range(0,lines.__len__()//x):
with open(txtFileName.format(i+1),'w') as split:
listofSplitFiles.append(txtFileName.format(i+1))
for j in range(0,x):
if( (i*x)+j < lines.__len__() ):
split.write(lines[(i*x)+j])
#Call ffmpeg on the list
for i in listofSplitFiles:
outputBaseName = os.path.basename(i)
outputFileName = os.path.splitext(outputBaseName)[0]
postFileName = os.path.splitext(outputBaseName)[0]
os.system("ffmpeg -f concat -i {} -safe 1 -r 30 -fflags +genpts -c:a copy ./clip/{}.mp4".format(i,outputFileName))
os.system('''ffmpeg -loglevel error -r 30 -i sfondo/bkg.png -i ./clip/output{}.mp4 -b:v 1M -filter_complex ''' + '''"[1:v]scale=''' + "750" + ''':''' + "1080" + ''' [ovrl], [0:v][ovrl]overlay=(main_w-overlay_w)/2:((main_h-overlay_h)/2)"''' + ''' ./media/{}.mp4''' .format(outputFileName,postFileName)) 不幸的是,我有一个错误./clip/{}.mp4: No such file or directory
发布于 2019-10-24 14:41:53
从ffmpeg的文档中可以看出,它将读取txt文件中的整个文件列表,并将它们连接到一个文件中。所以,您可以使用python读取concat.txt,将三行代码放入不同的文本文件中,然后在这些文件上运行ffmpeg。就像这样:
import os
x = 3 #Number of files you want to concatenate
#Making directories so that the working directory stays organized
txtFileName = "./splits/output{}.txt"
outputFile = "./output/output{}.mp4"
os.makedirs(os.path.dirname(txtFileName), exist_ok=True)
os.makedirs(os.path.dirname(outputFile), exist_ok=True)
#While splitting the files store their path to a list
listofSplitFiles = []
with open('./concat.txt','r') as concat:
lines = concat.readlines()
for i in range(0,lines.__len__()//x):
with open(txtFileName.format(i+1),'w') as split:
listofSplitFiles.append(txtFileName.format(i+1))
for j in range(0,x):
if( (i*x)+j < lines.__len__() ):
split.write(lines[(i*x)+j])
#Call ffmpeg on the list
for i in listofSplitFiles:
outputBaseName = os.path.basename(i)
outputFileName = os.path.splitext(outputBaseName)[0]
os.system("ffmpeg -f concat -i {} -safe 1 -r 30 -fflags +genpts -c:a copy ./output/{}.mp4".format(i,outputFileName))不过,需要注意的是,有better ways来读取文件,但据我所见,我认为您需要一个快速脚本将多个文件连接在一起。所以f.readlines()不应该是问题
https://stackoverflow.com/questions/58539173
复制相似问题