FFMPEG Конкатенация X видео во время из list.txt - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь объединить 3 видео за раз из list.txt, я могу объединить все видео в списке в одно длинное видео, но я хочу объединить x видео из списка в одном выводе, затемобъединить следующие x видео из того же списка в другой вывод и т. д.

Сценарий, который я разрабатываю, написан на python, извлекает некоторые видео с сервера и сохраняет их локально в папке и пишетмой concat.txt, затем ffmpeg прочитал concat.txt и создала один выходной файл. их в output1.mp4, затем прочитайте следующую строку x из cancat.txt, объедините их в 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

1 Ответ

1 голос
/ 24 октября 2019

Из документации ffmpeg concat выглядит так, будто она прочитает весь список файлов в 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))

Следует отметить, что есть лучшие способы чтения файла, но, как я вижу, вам нужен быстрый скрипт для объединения нескольких файлов вместе. Так что f.readlines () не должно быть проблемой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...