web-dev-qa-db-ja.com

soxを使用してmp3ファイルをwavにバッチ変換する

単一の.mp3の場合、次を使用してwavに変換できます

sox ./input/filename.mp3 ./output/filename.wav

私は試した:

#!/bin/bash
for i in  $(ls *mp3)
do
    sox -t wav $i waves/$(basename $i)
done

ただし、次のエラーがスローされます。

sox FAIL formats: can't open input file `filename.mp3': WAVE: RIFF header not found

入力フォルダー内のすべてのmp3ファイルに対してこのsox変換をどのように実行し、生成されたwavを出力フォルダーに保存しますか?

PS:逆引用符( `)とアポストロフィで囲まれたファイルを表示する理由がわかりません'

`filename.mp3 '

私はすべてのmp3を再生し、それらは完璧に機能します。

5
kRazzy R

ファイル名にスペースが含まれている問題が発生しているようです。 「My Greatest Hits.mp3」という名前のファイルがある場合、コマンドは「My」、「Greatest」、「Hits.mp3」という3つの異なるファイルを変換しようとします。 "$()"構文を使用する代わりに、for行で "* .mp3"を使用し、soxコマンドでファイル名を引用符で囲んでください。

さらに、basenameコマンドはファイル拡張子を削除せず、フォルダー名のみを削除します。したがって、このコマンドは ".mp3"拡張子の付いた一連のWAVファイルを作成します。コマンドに「-s .mp3」を追加すると、basenameは拡張子を削除し、最後に「.wav」を置くと正しい拡張子が追加されます。

まとめると、次のようになります。

for i in *.mp3
do
    sox "$i" "waves/$(basename -s .mp3 "$i").wav"
done
6

まず、そのようにlsを使用しないでください。実際にファイル名を生成するのはシェルであるため、実際には何もしませんdo。グロブ*mp3とにかく。さらに、ファイルの名前に空白が含まれていると、ファイルが壊れます。

エラーについては、ここでsoxはMP3ファイルをwavとして解釈しようとしていると思います。これは、-t wavフラグを指定したためです。単一ファイルの場合と同じように、それなしで実行できると思います。出力ファイル名の拡張子も変更するだけです。 basenameは、削除する対象を指定すると、サフィックスも削除できます。

#!/bin/bash
for i in *.mp3
do
    sox "$i" "waves/$(basename "$i" .mp3).wav"
done

(バックティックアポストロフィは、ファイル名`quoting'の古い習慣です。バックティックは、左側の引用符のように見えるはずです。回転したコンマのように見えます( 上の例を参照) Wikipedia )。しかし、技術的にはそれは間違っており、最新のフォントではひどいように見えます。)

1
ilkkachu

明らかに、soxはmp3形式のファイルを処理できないと言っています。私はあなたのシステムで出力を得ることに非常に興味があります:

sox ./input/filename.mp3 ./output/filename.wav

あなたのsoxは一般的にmp3を処理できないようです。はい、soxはmp3を処理するように再コンパイルできますが、エラーメッセージはファイルを読み取っていることを示していますが、wavを期待しています:WAVE: RIFF header not found

スペースの問題に関するその他のコメントは、引き続き一般的に適用されますが、ファイルfilename.mp3にはスペースがありません。それはmp3です。

0
PePa