余分なファイルなしで、単一のコマンドを使用して複数のWAVファイルを連結します


32

FFMPEGを使用して、複数のWAVファイルを単一のWAVファイルに連結したい。

次のコマンドを使用しましたが、必要なファイルが生成されます。

コマンド:

ffmpeg -f concat -i mylist.txt -c copy output.wav

ファイル:

#mylist.txt
file '1.wav'
file '2.wav'
file '3.wav'
file '4.wav'

ただし、問題を確認できるように、連結するWAVファイルのリストを指定するテキストファイルを作成する必要があります。

私はこれらのすべてのタスクを実行できますが、次のような単一のコマンドを好むでしょう

ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav output.wav 

または

ffmpeg -i "concat:1.wav|2.wav|3.wav|4.wav" -c copy output.wav

これらの2つの単純なコマンドを試しまし1.wav たが、目的の結果を達成する単一のコマンド(または上記の2つのコマンドを修正)を書くのを手伝ってくださいという声だけを返します。

他のメディアエンコーダー/エディターを提案しないでください。FFMPEGのみを使用します。他の場所で既にインストールされ使用されているためです。

回答:


34

concat フィルターを使用してみてください。再エンコードが必要なので、より多くのシステムリソースが必要になります(この特定のケースでは、漠然と現代のコンピューターではかなり小さい量)が、PCM-> PCMオーディオは数学的にロスレスでなければなりません。あなたの場合、次のようなものを使用します:

ffmpeg -i input1.wav -i input2.wav -i input3.wav -i input4.wav \
-filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]' \
-map '[out]' output.wav

5つの入力ファイルがある場合は、を使用しますn=5


4
注:[0:0][1:0][2:0][3:0]ファイルの数に合わせてカスタマイズしないでください。それを正確に使用してください。変更する必要があるのは、入力ファイルとn=4
Keavon

8
@キーボン:よろしいですか?ここToo many inputs specified for the "concat" filter.で、元のコードで2つの入力のみを処理しようとすると、ffmpeg(バージョンN-49352-gc46943e x64)でエラーが発生します。それは私が削除したときにかかわらず動作します[2:0][3:0]。この場合のストリームとしてはそのようなものは存在しないので、私には理にかなっている... 2:03:0...
Bigue Nique

@BigueNiqueに同意します。私も同じエラーに遭遇し、少しばかげているように感じますが、与えられた適切なシーケンスを生成するコードを書きましたn
ライアンデュバル

19

最良のオプションは、ffmpegではなくsoxを使用することだと思います。

$ sox short1.wav short2.wav short3.wav long.wav

解決策は、(ゼロ詰めされていない)数字の順序を保持しながら、一連の.wavファイルを追加するにはどうすればよいですか?


1
これがために働くことがあり.wavますが、soxサポートしていないようです.mp3
アーロンフランケ

1
質問は正確に.wav
ヘクターM.モナッチ

1
私は、この方法を非WAVファイルで使用しようとする人のためにメモを追加しているだけです。
アーロンフランケ

質問は、ffmpegのみを使用してソリューションが必要であると明示的に述べています!
マヌー

soxは.mp3ファイルもサポートできます
ベンジャミン

9

言及ウィキFFmpegの使用concatプロトコルは、すべての種類のファイルでは不可能です。ほとんどのMPEGコンテナおよびビットストリームで正常に動作しますが、PCMオーディオを含むWAVファイルでは明らかに動作しません。

必ずしも一時ファイルを作成して使用する必要はありません。Bash(またはプロセス置換をサポートする他のシェル)を使用すると、1つのコマンドですべてを実行できます。

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav

プロセス置換<( )は、ファイル(正確にはファイル記述子)をその場で作成し、ffmpeg読み取り可能にします。このファイルには.wav、現在のディレクトリ内のすべてのファイルへのパスが含まれます。$(pwd)ファイル記述子からではなく、現在のディレクトリからの正しいパスを取得するために、接頭辞を付ける必要があります。

もちろん、置換内のコマンドは別のものに変更できます。


2
Unsafe file nameエラーが発生した場合は、-safe 0前にオプションが必要-iです。ref。stackoverflow.com/q/38996925/297679
ノブ

3

別のオプションは、concatを使用することです

ffmpeg -i "concat:file1.mp3 | file2.mp3 | file3.mp3" -acodec copy out.mp3


1
スーパーユーザーへようこそ:これは質問に答えるかどうかはわかりませんが(答えは受け入れられています)、ソリューションが詳細に機能し、わかりやすい手順を説明することができれば、より良い答えになるでしょう。答えが正しいと思う場合は、これらのことを行い、再編集してください。数分を取り、お読みください: - superuser.com/help .Answering:superuser.com/help/how-to-answer、再びsuperuser.Thankyouへの歓迎
mic84

これをテストしましたが、動作していないようです
Nick Long

1

Win8のCmd.EXE .BATスクリプト:

Rem Get number of source files
For /F %%A In ('Dir *.3gp /B /A-D ^| Find /C /V ""') Do      Set FilCnt=%%A

Rem Build list of source filenames
Set Lst=
For    %%A In (     *.3gp                          ) Do Call Set Lst=%%Lst%% -i %%A

Rem Concat and Convert sources to target
FFMPeg.EXE %Lst% -filter_complex concat=n=%FilCnt%:v=0:a=1 -vn Output.OGG

この方法では、ソースファイル名やconcat-countパラメーターを気にする必要はありません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.