web-dev-qa-db-ja.com

複数の.mp3ファイルを1つの.mp3に連結する

提案されたように ここ 私はcatコマンドを使用して、複数の.mp3ファイルを1つの.mp3ファイルに連結しています。

現在のフォルダーに次の.mp3ファイルがあると想像してください。

001001.mp3 001002.mp3 001003.mp3 001004.mp3 001005.mp3

または、このように:

096001.mp3 096002.mp3 096003.mp3 096004.mp3

これらの.mp3ファイルを昇順で連結する必要があります。つまり、001001.mp3+001002.mp3+001003.mp3+etc.

これらの.mp3ファイルを1つに結合するために、現在のフォルダーで次のコマンドを実行しています。

cat *.mp3 > final.mp3

最終的な.mp3ファイルをテストしましたが、予想どおりですが、上記のコマンドが昇順でファイルを選択することをsureにする必要があります。

上記のコマンドが常に昇順でファイルを連結することを確認できますか?

ありがとうSir

43
Bakhtiyor

catは、このジョブに適したツールではありません。 MP3形式には、ファイルの先頭と末尾に潜む可能性のあるあらゆる種類のジャンクがありますが、これを取り除く必要があります。 mp3wrapはあなたが望むものです。ファイル内のメタデータを除外し、音声を結合します。

Sudo apt-get install mp3wrap
mp3wrap output.mp3 *.mp3

それを行う前に、ls *.mp3を実行して、それらが正しい順序であることを確認してください。もともとこの答えを書いたとき(6年以上前!)、ワイルドカードグロブは明らかにうまく動作しませんでしたが、今はそうなっていると思います。

たとえば、番号が付けられているがゼロが埋め込まれていない場合、{1-11}.mp31 10 11 2 3 4 5 6 7 8 9でソートされる場合、ファイルの名前を変更する必要があります。 これは簡単に修正できます

44
Oli

mp3wrap は十分な解決策のようですが、結果のファイルを再生したときにタイムスタンプが正しくありませんでした。後で分割したいことがわかっているファイルにmp3を結合する場合は、mp3wrapが最適に使用されるようです。

単にいくつかのmp3を恒久的に連結したかっただけです。最終的に、ffmpegを使用してファイルを連結しました。

  1. まず、ffmpegをインストールします

    • Ubuntu 15.04+

      Sudo apt install ffmpeg
      
    • Ubuntu 14.10以前
      http://ffmpeg.org/download.html に移動し、静的ビルドの1つをダウンロードして展開し、/ usr/local/binにコピーします

  2. ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy output.mp3

詳細: https://trac.ffmpeg.org/wiki/Concatenate#protocol
https://superuser.com/a/314245

25
bmaupin

前に提案したように、mp3wrapは良い解決策です。ただし、常に機能するとは限りません。私の知る限り、mp3wrapは、すべての入力ファイルがVBR対CBR、ビットレートなどの同じ特性を持っていると想定しています。この仮定が満たされない場合、失敗する可能性があります。その場合、唯一の解決策は、すべてのmp3ファイルを.wavなどの生の形式にデコードし、soxなどのプログラムと連結して、すべてをmp3に再エンコードすることです。

8
loevborg

単一の文字に基づいてアルファベット順に並べ替えます。それは、naughtの値が1よりも小さいため、「01」が「1」の前に来ることを意味します。

以下に例を示します。 1、2、3、04、05、および06という名前のファイルを含むディレクトリがあります。これらは、独自のファイル名を含むテキストファイルです。

test$ cat *
04
05
06
1
2
3

したがって、yes;ただし、すべてのファイルが適切に「パディング」されていることを確認する必要があります。

この気の利いたbashスクリプトの行を使用すると、ファイル名を視覚的に比較して、間違いを簡単に見つけることができます。

for f in $(ls); do printf "%05s\n" "$f"; done

出力は次のようになります。

   04
   05
   06
    1
    2
    3

そうでない場合は、ファイル名をパディングする必要があります。ファイル名をパッシングするためのBashスクリプトStackOverflowで説明しますそれをするために。


編集。 Oliの答えに投票してください。 :P
何かを追加するので、私はそのままにしますが、彼のソリューションを使用する必要があります。

mp3wrap output.mp3 `ls -1 *.mp3 | sort`

sortは上記で説明した方法で物事をソートしますが、ファイル名の長さが等しくない場合は、ファイル名にパディングする必要があることに注意してください。

5
Stefano Palazzo

ほとんどの人はmp3wrapを提案していますが、欠点もあります:生成されたファイルは一部のプレーヤーでその全長を報告しないため、そのポイントを過ぎてシークできません。

mp3catは、私が知る限り、仕事を迅速かつうまく行います。 http://mulholland.xyz/dev/mp3cat/ でダウンロードでき、次のように使用できます。

mp3cat file1.mp3 file2.mp3 file3.mp3

別の可能性はsoxです

Sudo apt-get install sox libsox-fmt-mp3
sox file1.mp3 file2.mp3 target.mp3

しかし、それは非常に遅いようです(おそらくオーディオをデコードして再エンコードしますか?)

4
josinalvo

オンラインサービス audio-joiner が非常にうまく機能し、正しいタイムスタンプ(mp3wrapとは反対)を保持することがわかりました。

3
orschiro

専用のオーディオ編集プログラム( Audacity など)を使用してみてください。

0
Lawand

私は bmaupinのコメント が大好きですが、それでもsort -Vを使用して自然な(バージョン)番号を生成できます。

find . -maxdepth 1 -iname '*.mp3' -print0 | sort -Vz | xargs -0 mp3wrap ../tmp.mp3

また、ファイル名に' " () [] {}などの特殊文字を扱う必要はありません。

0
zhoux