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のみを使用したいと思います。
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
を使用します。
私はffmpegではなくsoxを使用するのが最善の方法だと思います。
$ sox short1.wav short2.wav short3.wav long.wav
解決策は次のとおりです (ゼロが埋め込まれていない)数値の順序を保持しながら、.wavファイルの束を追加するにはどうすればよいですか?
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)
を前に付ける必要があります。
もちろん、置換内のコマンドは別のものに変更できます。
別のオプションはconcatを使用することです
ffmpeg -i "concat:file1.mp3 | file2.mp3 | file3.mp3" -acodec copy out.mp3
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パラメータを気にする必要がなくなります。
私は人々が同様の答えを投稿しているのを見ましたが、うまく機能するこの正確な答えは決してありません。
sox "file*" output.wav
上記のコマンドはすべてのファイルを結合し、*記号をワイルドカードとして使用します。引用符を使用して、シェルによる拡張の実行を回避します。代わりに、パラメーターをすべてのオーディオファイルに適用する方法でsoxに拡張を実行させます。