Ubuntuで複数の(2つ以上の)ビデオをマージする方法は?


39

各20個のバッチサイズでビデオをマージします。Linuxマシンを実行しています。ビデオはmp4形式で、中程度の品質です。オーディオストリームが欠落している場合もあります。これまでのところ私が試したffmpegmencodercvlc/vlcMP4Box。私はバッチ処理を行っているので、これを達成するためにコマンドラインスクリプトを書きたいです。

主な問題は、私が試したソリューションのいくつかは、2つのビデオでうまく機能すること、オーディオストリームを含むビデオでうまく機能すること、そしてビデオセットの他のサブセットでうまく機能することです。ただし、このタスクの包括的なソリューションを見つけることができませんでした。


2
複数のSEサイトで同じ質問をしないでください:superuser.com/questions/928548/…–
Maythux

これまでに試したことを具体的に投稿していただけますか?
オハール

1
@ohaal ffmpegフィルタやファイルプロトコルなど、に記載されているさまざまな連結方法を使用してみました。また、のconcat機能を使用してみましたcvlc/vlc。のconcat機能も試しましたmencoder。これらはすべて部分的に機能しました。これは最終的に私が問題を解決するのに役立ちました。
Dhruv新葛

はい、あなたはすでにツールについて言及しました、私が意味したことはあなたが実行した実際のコマンドでした。また、将来の訪問者のために、(あなたの答えに)あなたのためにそれを解決することになったコマンドを含めることができれば素晴らしいでしょう。
オハール

ああ、私はあなたの要点を見る。残念ながら、数が多いためコマンドをリストできません。私の問題を解決するコマンドは、このだったmelt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Dhruv新葛

回答:


41

mkvmerge複数のMP4ファイルを1つのファイルに結合するために使用しています。

mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4

3
.mkv出力ファイルには拡張子を使用することをお勧めします。これは、与える拡張子に関係なくMatroskaコンテナであるためです。
haridsv

インストール方法はmkvmerge次のとおり
モルゴス

このコマンドmkvmergeのみが機能します。ffmpegのものはすべて、少なくともオーディオがシフトすると失敗します。
42n4

25

あなたはそれを使用してそれを行うことができますffmpeg

ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4

参照および詳細


2
やってみた これの問題は、適切なアウトを与えないことです。1.オーディオトラックが混乱しています。2.ビデオトラックに多少の乱れがあります。
Dhruvシンガル

サンプル以上に使用しましたが、結果は高品質になりました。ソースビデオの品質に問題があるのでしょうか
Maythux

あなたはおそらく正しいです。これで問題が解決しました:askubuntu.com/a/637179/420614
Dhruv Singal

2
concatプロトコルを使用してMP4を連結しないでください。ほとんどの一般ユーザーが遭遇しない特定の形式でのみ機能します。代わりにconcat demuxerまたはconcatフィルターを使用してください。
llogan

私はそれぞれ30分の2つのmp4ファイルでffmpegを試しました。長さ7時間の出力ファイルを取得しました。
フース・


4

ffmpegを使用してトランスコードせずにMP4を連結するための小さなシェルスクリプトを作成しました。

for f in $(ls *.MP4); do
    ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")

ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4

rm *.ts

これにより、MPEGコンテナーに中間ファイルが作成され、それらがMP4に連結されます。


ファイル名にスペースまたは場合によっては特殊文字が含まれていると、このスクリプトが失敗することに注意することが重要です。ループの場合、を使用for f in *.MP4せずに使用する方が大幅に優れていますls。(あなたは、常に使用を避けるべきls重要な理由のカップルのためのスクリプトの中で、より良いオプションがあります。)また、変数のための引用符を使用し、あなたがある場合を除き、特定のスペースや他の特殊文字が含まれていないことなので、"${f}"(またはちょうど"$f")の代わりに、引用符で囲まれていません$f
水田ランダウ

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")1、2、3 ... 10 ... 20のファイル名ではうまく機能しません。最終的に1、10 ... 2、20 ...などとして解析されます。これによりCONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")、順序が保証されます。。
tisaconundrum

2

次の形式で連結するすべてのファイルを含むファイルfiles.txtを作成します(#で始まる行は無視されます)。

# this is a comment
file 'file1.mp4'
file '/path/to/file2.mp4'
file 'file3.mp4'

これらは相対パスでも絶対パスでもかまいません。その後、ファイルをストリームコピーまたは再エンコードできます。

ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4

0

私のスクリプト、純粋にbashffmpeg。コマンドラインで指定されたファイルを1つに再エンコードします。

ファイルは同じ解像度である必要があります。異なるメタデータローテーションを受け入れますが、受け入れffmpeg concat:ません。

rm ffmpeg-concat-output.mkv

FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in $@; do
    echo "Processing ${FNAME}"
    INPUTS="${INPUTS} -i $FNAME"

    if [ -z "${FILTER}" ]; then
        FILTER="[$INDEX:v:0] [$INDEX:a:0]"
    else
        FILTER="${FILTER} [$INDEX:v:0] [$INDEX:a:0]"
    fi
    let INDEX+=1
done

COMMAND="ffmpeg ${INPUTS} \
    -filter_complex '${FILTER} \
        concat=n=${INDEX}:v=1:a=1 [v] [a]' \
    -map '[v]' -map '[a]' \
    ffmpeg-concat-output.mkv"

#   -af 'volume=15dB' # won't work with -filter_complex

bash -c "${COMMAND}"

0

moviepyを使用してサブセグメントも連結できるPythonスクリプトを作成しました(たとえば、ビデオから一部を削除する場合に便利です)。

以下で使用します:

vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>

-1

Maythuxの回答に加えて、以下から

いくつかのマルチメディアコンテナ(MPEG-1、MPEG-2 PS、DV)では、それらを含むファイルを単に連結するだけでビデオを連結できます。

つまり、連結するビデオは上記のビデオコンテナの1つを使用します(個人的な体験のためにMPEG-4パート14を追加します)。

cat video1.ext video2.ext video3.ext > video4.ext

1
これを試しましたが、最初のビデオのみが出力として返されます。私はどこかでそれが機能しないことを読みましたが、この背後にある理論的根拠は覚えていません。
Dhruvシンガル

@DhruvSingalはい、これを確認できます。まったく同じビデオ/オーディオエンコーディングの2つのMP4ビデオで試してみましたが、最初のビデオだけを閲覧できました。これは理にかなっているように思えますが、これまでに2、3のMP4ビデオでこれをやったことがあると確信しています。おそらくメモリがここでうまく機能していないか、これが機能するための他の要件があります。私は、私も興味があるため、この上で検索するには、私が何かを見つけた場合、私は答えを更新し、あなたのコメントをドロップしますたい
KOS

何らかの方法で、最初のビデオの開始時にメタデータを変更して、結合された映画の長さ全体を含むようにする必要があります。ほんの数MPEG4ファイルには、私は、メタデータを見てみましょう...
ケンMollerup
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.