web-dev-qa-db-ja.com

avconvでビデオをマージする方法は?

フォルダにいくつかのチャンクがあります。

0001.mp4
0002.mp4
0003.mp4
...
0112.mp4

それらをfull.mp4にマージしたい

私は使用しようとしました:

avconv -f concat -i <(printf "file '%s'\n" /root/chunk/*.mp4) -y \
-c copy /root/test/full.mp4

不明な入力形式: 'concat'

avconv -f concat -i <(printf "%s|" /root/chunk/*.mp4) -y \
-c copy /root/test/full.mp4

不明な入力形式: 'concat'

avconv -i concat:`ls -ltr /root/chunk/*.mp4 | awk 'BEGIN {ORS="|"} { print $9 }'` \
 -c:v copy -c:a copy /root/test/full.mp4

前の版では、1つの入力ファイルのみが出力にキャッチされました。

フォルダのすべてのチャンクを完全なビデオにマージする方法は?

Ffmpegなどを使いたくありません。 Avconvのみ。

36
Alex
avconv -i concat:file1.mp4\|file2.mp4 -c copy output.mp4

コンテナのタイプで動作するかどうかはわかりません(AVIで動作します)。

19
test

「受け入れられた」答えが示すように、mp4ファイルを単純に連結することはできません。

それだけを実行すると、output.mp4の内容のみがfile1.mp4になります。

そうは言っても、元のファイルを正しくmpegストリームに分割する限り、元の質問で何をしようとしているかを実際に行うことができます。

次のコマンドは、input.mp4をfile [1-3] .tsの3x 60秒セグメントに分割します。

avconv -ss 0 -i input.mp4 -t 60 -vcodec libx264 -acodec aac \
    -bsf:v h264_mp4toannexb -f mpegts -strict experimental -y file1.ts
avconv -ss 0 -i input.mp4 -t 60 -vcodec libx264 -acodec aac \
    -bsf:v h264_mp4toannexb -f mpegts -strict experimental -y file2.ts
avconv -ss 0 -i input.mp4 -t 60 -vcodec libx264 -acodec aac \
    -bsf:v h264_mp4toannexb -f mpegts -strict experimental -y file3.ts

その後、他の答えが示唆するようにそれらを元に戻すことができます:

avconv -i concat:"file1.ts|file2.ts|file3.ts" -c copy \
   -bsf:a aac_adtstoasc -y full.mp4

このプロセスを使用して、以下で説明されているスケーラブルな並列トランスコーダーを作成しました。

35
Dustin Kirkland

Mp4の場合、私が見つけた唯一の有効なソリューションは、gpacパッケージのMP4Boxでした。

#!/bin/bash
filesList=""
for file in $(ls *.mp4|sort -n);do
    filesList="$filesList -cat $file"
done
MP4Box $filesList -new merged_files_$(date +%Y%m%d_%H%M%S).mp4

またはコマンドは

MP4Box -cat file1.mp4 -cat file2.mp4 -new mergedFile.mp4

mencoderとavconvでは、動作させることができませんでした:-(

10
Pipo

これは動作します

avconv -i 1.mp4 1.mpeg
avconv -i 2.mp4 2.mpeg
avconv -i 3.mp4 3.mpeg

cat 1.mpeg 2.mpeg 3.mpeg | avconv -f mpeg -i - -vcodec mpeg4 -strict experimental output.mp4

Avconvしかない場合は上記のように機能しますが、ffmpegには関数を追加しています...

「上記のavconvステップは不必要な追加の損失のあるエンコードステップを実行するため、低速で出力の品質が低下します。代わりにconcat demuxer(追加情報)またはconcatフィルターを使用することをお勧めしますが、avconvにはFFmpegのffmpegで利用できる機能がありません」-@ N

    SEE  https://trac.ffmpeg.org/wiki/Concatenate

名前付きパイプをサポートするシステムを使用している場合は、それらを使用して中間ファイルの作成を回避できます-これにより、stderr(ffmpegがすべての書き込まれたデータを送信)が/ dev/nullに送信され、コマンドラインが乱雑になりません:

mkfifo temp1 temp2
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1 2> /dev/null 
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2 2> /dev/null 
ffmpeg -f mpegts -i "concat:temp1|temp2" -c copy -bsf:a aac_adtstoasc output.mp4
6
Scott Stensland

これは私のために働く:

avconv -i "concat:001.mp4|002.mp4|003.mp4" -c copy full.mp4

再エンコードせずに、すべてのファイルを1つのmp4に連結するだけです。

2
romaroma

これを行うには、ffmpegコマンドを使用しています。以下に例を示します。

ffmpeg -i concat:/dev/null|file1.ts|file2.ts -c copy -bsf:a aac_adtstoasc -y output.mp4

Distributed parallel video trascoding のこのgithubプロジェクトを見てください

0
MaheshPatade

エラーメッセージへの回答が得られなかった後、これらすべての同様の回答がありました。

~ avconv -i 'concat:' -c copy test.mp4
avconv version 12.3, Copyright (c) 2000-2018 the Libav developers
  built on Jan 22 2019 21:47:11 with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
concat:: Protocol not found

私はいくつかのGoogleの結果を掘り下げ、バグトラッカーに行き、これらを見つけました:

ある時点で無効にされただけでなく、バ​​ージョン12で削除されたようですが、HomebrewのMac 10.13.6のビルド12.3には、入力プロトコルに「concat」がリストされており、ドキュメントにも表示されています。 1つの未解決のバグレポート。

私はこのコマンドを使用していくつかの運がありました:

cat *.VOB | avconv -i - -c copy test.mp4
0
Pysis

私はavidemux(gtkツール)でそれをやった。ほとんどのLinuxで、WindowsおよびMacでもパッケージとして入手できます。最初のファイルを開いただけです。次に、次のものを順番に追加しました。最後に、オーディオとビデオのコピーとフォーマットmp4を使用して、連結されたビデオを保存しました。

うまくいきました!

0
Pielo

ビデオを正常に連結するAvdshare Video Converter 7という名前のツールを見つけました。さらに、私が望むほぼすべての形式にトランスコードします。

このページでeveryソリューションを試しました...allあなたが私の答えを読んでいる場合にあなたがたぶん遭遇したのと同じエラーを私に。 「プロトコルが見つかりません」と動揺しますか?多分これもあなたのためのプログラムです。

Windowsで実行しています。

プログラムで2つのビデオを連結する手順は次のとおりです。

ビデオをプログラムにドラッグアンドドロップします

マージをクリック

微調整したいすべてのパラメーターを指定する「プロファイルの保存」を選択します

[保存]ボタンをクリックします

0
MikeyB

このメソッドは、raw * .aviファイルのみを連結するためのものです。しかし、aviファイルに参加したい人の多くはこの質問を見ることになるので、とにかくここに答えを投稿します。

cat *.avi > out_tmp.avi
avconv -i out_tmp.avi -c copy output.avi

もう一度:非圧縮* .aviファイルに対してのみ動作します。

0
installero