web-dev-qa-db-ja.com

再エンコードせずにMP4ビデオファイルを切り取り、マージする方法

Ubuntu 18.04を使用して、mp4コンテナ(h.264/mp3コーデック)にいくつかのスクリーンキャストビデオファイルがあり、それらは時々マージ(つまりC.mp4 = A.mp4 + B.mp4)したり、時々いくつかの間隔(例D .mp4 = A.mp4 [0,320 {seconds}] + A.mp4 [325,340] + C.mp4)。

私は今kdenliveを使用していますが、問題はありませんが、すべてを再エンコードしており、そのようなタスクには少し多すぎるようです。

再エンコードせずにそれを行うためのより簡単な方法はありますか?(そしておそらく、おそらく推奨されるコマンドラインまたは安定したPython/Julia/R/..方法)?

私はPDFtkのためにPDFtkのようなものを考えています:-))

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)
3
Antonello

あなたはffmpegでそれを行うことができます。オプションを適切に注文し、さらに2つ追加する必要があります。

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

ここ から。

2
javimixet

まあ、私自身の質問に投稿されているように、これは再エンコードの問題を解決しませんが、少なくとも便利なインターフェイスです。と一緒に使うだけ

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
Antonello