Как сократить и объединить mp4 видеофайлы без перекодирования

Используя Ubuntu 18.04 у меня есть некоторые видеофайлы скринкаста в mp4 контейнере (h.264/mp3 кодеки), что я хочу в слиянии времен (т.е. C.mp4 = Mp4+B.mp4) или при сокращении времен, удаляющем некоторые интервалы (например, D.mp4 = Mp4 [0,320 {секунды}] +A.mp4[325,340]+C.mp4).

Я теперь использую kdenlive, это воки, но это повторно кодирует все и это кажется немного слишком много для такой задачи.

Есть ли более простой способ сделать это, не повторно кодируя (даже, и возможно предпочтенный, командная строка или стабильный Python/Julia/R/.. путь)?

Я думаю в чем-то как PDFtk для pdfs :-))

PS: Я действительно пробовал ffmpeg -ss 00:00:05 -to 00:00:10 -i test1.mp4 test2.mp4 но у меня есть ошибка:

Опция к (запись или время остановки транскода) не может быть применена для ввода url test1.mp4 - Вы пытаетесь применить входную опцию к выходному файлу или наоборот. Переместите эту опцию перед файлом, которому она принадлежит.

Мои файлы имеют тот же контейнер, кодек и разрешение.

(Я не знаю ничего из видео материала..)

Править: Я не хочу выглядеть пессимистичным, но больше я считаю его больше, я веду себя, который, что я думавший быть супер простым действительно супер, усложняют. Как жаль никто не записал высокоуровневый интерфейс для выполнения чего-то как этот.. Я уверен, что я не первый с такой потребностью..

EDIT2: Я нашел 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
задан 2 January 2019 в 13:53

2 ответа

Ну, как отправлено в моем собственном вопросе это не решает проблему перекодирования, но по крайней мере это - удобный интерфейс. Просто используйте его с

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 действительно хорошо смочь сделать то, что Вы хотите сделать через несколько часов из-за огромной документации, которую можно найти в сети о Python..

0
ответ дан 2 December 2019 в 04:39

Можно сделать это с ffmpeg. Необходимо заказать опции правильно и добавить еще два:

ffmpeg -i INFILE.mp4 -vcodec copy -acodec copy -ss 00:01:00.000 -t 00:00:10.000 OUTFILE.mp4

Отсюда.

1
ответ дан 2 December 2019 в 04:39

Другие вопросы по тегам:

Похожие вопросы: