Как вырезать и объединять MP4 видео файлы без перекодирования
Используя Ubuntu 18.04, у меня есть некоторые видеофайлы с экранным просмотром в контейнере mp4 (кодеки h.264/mp3), которые я хочу иногда объединять (например, C.mp4 = A.mp4+B.mp4) или иногда вырезать, удаляя некоторые интервалы (например, D.mp4 = A.mp4[0,320{секунд}]+A.mp4[325,340]+C.mp4).
Сейчас я использую kdenlive, он работает, но перекодирует все, и это кажется слишком сложным для такой задачи.
Есть ли более простой способ сделать это без перекодирования (даже, и, возможно, предпочтительнее, командной строки или стабильного пути Python/Julia/R/..)?
Я думаю о чем-то вроде PDFtk для PDF-файлов:-))
PS: я попробовал ffmpeg -ss 00:00:05 -to 00:00:10 -i test1.mp4 test2.mp4
но у меня есть ошибка:
Опцию (время остановки записи или транскодирования) нельзя применить к URL-адресу ввода test1.mp4 - вы пытаетесь применить опцию ввода к выходному файлу или наоборот. Переместите эту опцию перед файлом, которому она принадлежит.
Мои файлы имеют одинаковый контейнер, кодек и разрешение.
(Я ничего не знаю о видео материал..)
РЕДАКТИРОВАТЬ: Я не хочу выглядеть пессимистично, но больше я смотрю на это больше, я веду себя так, что то, что я считаю супер простым, действительно супер сложным. Как жаль, что никто не написал высокоуровневый интерфейс для выполнения чего-то подобного... Я уверен, что я не первый с такой необходимостью...
РЕДАКТИРОВАТЬ 2: Я нашел moviepy, но он все еще далек от моей первоначальной идеи (он перекодирует и имеет более длинный, чем нужно, API. Я могу написать его, но проблема перекодирования остается):
pip install moviepy
from moviepy.editor import VideoFileClip, concatenate_videoclips
c1 = VideoFileClip("test1.mp4").subclip(0,5)
c2 = VideoFileClip("test1.mp4").subclip(10,15)
f = concatenate_videoclips([c1,c2])
f.write_videofile(test2.mp4)
2 ответа
Вы можете сделать это с помощью ffmpeg. Вам нужно правильно упорядочить параметры и добавить еще два:
ffmpeg -i INFILE.mp4 -vcodec copy -acodec copy -ss 00:01:00.000 -t 00:00:10.000 OUTFILE.mp4
Ну, как написано в моем собственном вопросе, это не решает проблему перекодировки, но, по крайней мере, это удобный интерфейс. Просто используйте его с
vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>
#!/usr/bin/python3
import sys, getopt, re
def printerror(errormsg):
print("*** vcat - concatenate video segments using moviepy ***\n")
print("ERROR:", errormsg,"\n")
print("Usage: vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>")
print("Optional start and end points should be given in seconds. If files have spaces should be quoted (e.g. \"input file.mp4[5-30]\").")
try:
from moviepy.editor import VideoFileClip, concatenate_videoclips
except ImportError:
printerror("You don't seem to have moviepy installed. Install it with `pip install moviepy`.")
exit(1)
def main(argv):
inputfiles_arg = ''
outputfile = ''
try:
opts, args = getopt.getopt(argv,"hi:o:",["input=","output="])
except getopt.GetoptError as err:
printerror(str(err))
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
printerror("")
sys.exit()
elif opt in ("-i", "--input"):
inputfiles_arg = arg
elif opt in ("-o", "--output"):
outputfile = arg
if outputfile =='':
printerror("Output file not specified")
iFiles = inputfiles_arg.split(',')
clips=[]
for iFile in iFiles:
subclip = re.search(r"\[([0-9\-\.]+)\]", iFile)
if subclip is None:
clips.append(VideoFileClip(iFile))
else:
dims = subclip.group(1).split('-')
if len(dims) != 2:
printerror("If a specific segment of a file is specified, this should be given as [startseconds-endseconds]")
iFile = iFile.replace("["+subclip.group(1)+"]",'')
clips.append(VideoFileClip(iFile).subclip(float(dims[0]),float(dims[1])))
f = concatenate_videoclips(clips)
f.write_videofile(outputfile)
if __name__ == "__main__":
main(sys.argv[1:])
Отказ от ответственности: я не использую Python некоторое время, поэтому уверен, что могут быть более подходящие подходы... bdw это действительно приятно иметь возможность делать то, что вы хотите сделать в течение нескольких часов из-за огромной документации, которую вы можете найти в сети о питоне..