web-dev-qa-db-ja.com

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

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は既にインストールされ、他の場所で使用されているため、FFMPEGのみを使用したいと思います。

38
Manu

concatfilter ;を使用してみてください。再エンコードが必要なため、システムリソースが多くなります(この特定のケースでは、漠然とした最近のコンピューターではかなり少量です)が、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を使用します。

39
evilsoup

私はffmpegではなくsoxを使用するのが最善の方法だと思います。

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

解決策は次のとおりです (ゼロが埋め込まれていない)数値の順序を保持しながら、.wavファイルの束を追加するにはどうすればよいですか?

20

FFmpeg wikiの言及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)を前に付ける必要があります。

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

11
slhck

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

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

3
Ivan Malyshev

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パラメータを気にする必要がなくなります。

1
Bilbo

私は人々が同様の答えを投稿しているのを見ましたが、うまく機能するこの正確な答えは決してありません。

sox "file*" output.wav

上記のコマンドはすべてのファイルを結合し、*記号をワイルドカードとして使用します。引用符を使用して、シェルによる拡張の実行を回避します。代わりに、パラメーターをすべてのオーディオファイルに適用する方法でsoxに拡張を実行させます。

0
Goddard