web-dev-qa-db-ja.com

Ffmpegを使用してwmaをmp3に再帰的に変換し、txtファイルからインポートする方法は?

私はフォーラムからさまざまなオプションを試しましたが、それらのほとんどは時代遅れです(ffmpegは-sameqオプションのようにそれについて教えてくれます)。ドキュメントを理解しようとしていますが、理解できません。

私はffmpegでwmaからmp3に再帰的に変換する方法を知りたいです。たとえば、出力の最大ビットレートは192kbpsです(元が128kbpsの場合は192ではありません)

14Kのwmaファイルが多くのディレクトリに広がっている場合を除きます。それで、私はそれらを動かしたくありません。ファイル名とメタデータを保持したまま変換し、作成できるtxtファイルから変換するファイルのリストを読み取れる場合は、それらを削除します(1行に1ファイル)。これを使用して、再帰検索を実行し、貼り付けます。

助けてくれてありがとう。また、Ffmpegについての説明に感謝します。

カロキソ

PS:Soundconverterは以前は良好でしたが、低速でした。今はどちらでもありません。私のように、多くの場合、14.04では機能しません。 Soundkonverterを使用していますが、非常に遅いです。したがって、これらすべては、この推奨事項を防ぐためのものです。そして、この強力なffmpegの使い方を学びたいです!およびCLI

注:以下のスクリプトは、最初の変換で機能していました。しかし、私が説明できない何らかの理由で、mp3を残さずに、変換中のwmaを突然削除しました。そこで、私は再び「未解決」に変更しました(誰かの問題を時折防ぐため)。問題はavconv「アプリケーションがストリーム0でマルチプレクサに単調に増加しない無効なdtsを提供したようです:23606> = 21720」(このバグの開発に興味がある人がいる場合、コメントにペーストビンがあります)。したがって、将来avconvはありません。

6
CaRoXo

これは、brewにavconvがないMacで、現在のディレクトリ内のすべてのファイル(名前にスペースが含まれている場合に機能する)をffmpegに使用するコマンドです。

for file in *.wma; do ffmpeg -i "${file}"  -acodec libmp3lame -ab 192k "${file/.wma/.mp3}"; done
16
Dan Rahmel

ターミナルで、最初にcdを使用して、すべての音楽を含むフォルダーを参照します。例:

cd /home/username/music/wma-to-convert

以下は、現在のフォルダー内のすべてのファイルと「wma」で終わるすべてのサブフォルダーのリストを作成し、wma-files.txtというテキスト文書にリストを保存します。

find . -type f | grep wma$ > wma-files.txt

または、必要に応じてテキストファイルを手動で作成することもできます。次に、テキストエディタで次のように入力し、wma-files.txtと同じディレクトリに保存します。たとえば、conv-scriptという名前を付けます。

#!/usr/bin/env bash

readarray -t files < wma-files.txt

for file in "${files[@]}"; do
    out=${file%.wma}.mp3
    probe=`avprobe -show_streams "$file" 2>/dev/null`
    rate=`echo "$probe" | grep "^bit_rate" | sed "s:.*=\(.*\)[0-9][0-9][0-9][.].*:\1:" | head -1`
    ffmpeg -i "$file" -ab "$rate"k "$out"
done

おそらくスクリプトで実行可能ビットを設定する必要があります。

chmod +x conv-script

次に、それを実行するだけです:

./conv-script

ffmpeg行の最後にこれを追加するオプションもありますが、注意してください:

 && rm "$file"

Avprobeにアクセスできない場合は、同等の処理を行うffprobeを使用できます(つまり、bit_rateを取得します)。それを行うには:

交換:

probe=`avprobe -show_streams "$file" 2>/dev/null`
rate=`echo "$probe" | grep "^bit_rate" | sed "s:bit_rate=\([0-9]\+\)[0-9]\{3\}:\1:" | head -1`

で:

rate=`ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 "$file"`

これが完了すると、すべてのファイルの変換が開始され、wmaオリジナルが削除されます!これはflacファイルをmp3に変換するのに非常に役立ちました。残念ながら、テストするwmaはありませんが、それらにも同様にうまくいくはずです。

注:私は問題を予見しませんが、いくつかのファイルを新しいディレクトリにコピーし、それらでテストすることをお勧めします。

Wmaをmp3に頻繁に変換する場合、以下のスクリプトは、引数として指定されたフォルダー内のすべてを自動的に変換および削除します。上記を少し改善します。さらに、ffmpegコマンドは最初に提案されたコマンドとは少し異なります。最初のコマンドが機能しない場合は、以下のコマンドを使用してください。

#!/usr/bin/env bash

cd "$1"
find . type f | grep wma$ > wma-files.txt

readarray -t files < wma-files.txt

for file in "${files[@]}"; do
    out=${file%.wma}.mp3
    ffmpeg -i "$file" -map_metadata 0:s:0 $out"
done
rm wma-files.txt

次に、ターミナルに次のように入力して呼び出します。

./convScript /home/username/music

したがって、すべての音楽フォルダーとそのサブフォルダーのwma音楽は自動的にmp3に変換されます。

前と同様に、ファイル削除のためにffmpeg行の最後にこれを追加できます。

&& rm "$file"

編集(2017/06/23):rmをデフォルトにしない

9
TheSchwa

すべてのバージョン

Mplayerでこれを行うきちんとした方法を見つけました。このスクリプトは、ファイル名を変更してファイル名をすべて削除し、現在のディレクトリのすべての.wmaファイルを.mp3に再帰的に変換します。

#!/bin/bash
for f in *.wma; do
 newname=`echo $f | tr ' ' '_' `
 mv "$f" $newname
 f=$newname
 mplayer $f -novideo -ao pcm:file=tmp.wav
 lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}
 rm -f tmp.wav
done

ワンライナー版は次のとおりです。

for f in *.wma; do; newname=`echo $f | tr ' ' '_' `; mv "$f" $newname; f=$newname; mplayer $f -novideo -ao pcm:file=tmp.wav; lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}; rm -f tmp.wav; done
3
mchid

これらの変更を加えて、TheSchwaスクリプトを書き換えます(TheSchwa!に感謝します)。

  • avprobe検出は機能します(少なくとも現在のDebian不安定版のffprobeバージョン2.5.2では)。
  • rmでファイルを削除しないでください(通常、コンバーターはファイルを削除しません。これは大きな驚きです!)。
  • スクリプトでwmaファイルをロードします。
  • バイナリが見つからない場合に役立ちます。
#!/bin/bash

which ffmpeg > /dev/null || { echo "Install ffmpeg, with 'Sudo apt-get install ffmpeg'" >&2; exit 1; }
which avprobe > /dev/null || { echo "Install libav-tools, with 'Sudo apt-get install libav-tools'" >&2; exit 1; }

output_format=mp3
file=`mktemp`
find . -type f | grep -i wma$ > $file

readarray -t files < $file

for file in "${files[@]}"; do
    out=${file%.wma}.$output_format
    probe=`avprobe -show_streams "$file" 2>/dev/null`

    rate=`echo "$probe" | grep "^bit_rate" | sed "s:bit_rate=\([0-9]\+\)[0-9]\{3\}:\1:" | head -1`
    ffmpeg -i "$file" -ab "$rate"k "$out"
done
3
pevik

これは parallel を使用したbashスクリプトです。

#!/bin/bash

parallel -i -j$(nproc) ffmpeg -i {} -acodec libmp3lame -ab 192k {}.mp3 ::: ./*.wma
rename 's/.wma//' *.wma.mp3
1
Aubin

注:以下は15.04、15.10または16.04には適用されません

最初:

ffmpegは14.04で非推奨になり、代わりにavconvを使用する必要があります。

Sudo apt-get install avconv

このコマンドを使用して、wmaファイルをmp3に再帰的に変換します。

for i in `find . -type f -name '*.wma'`; do avconv -i "$i" "${i/.wma/.mp3}"; done

次に、ファイルの品質を確認したら、このコマンドを実行して、元の.wmaバージョンを再帰的に削除または削除できます。

for i in `find . -type f -name '*.wma'`; do rm "$i"; done

次:

代わりにスクリプトでコマンドを使用する方法を次に示します(名前は「wma2mp3」:

Sudo nano /usr/local/bin/wma2mp3

これをコピーしてファイルに貼り付けます。

#!/bin/bash
for i in `find . -type f -name '*.wma'`; do avconv -i "$i" "${i/.wma/.mp3}"; done

押す ctrl + o を押して enter ファイルを保存して使用するには ctrl + x 出る。

次に、次のコマンドでファイルを実行可能にします。

Sudo chmod +x /usr/local/bin/wma2mp3

これで、コマンドwma2mp3を実行して、すべてのwmaファイルをmp3に再帰的に変換できます。

スクリプトで同じことを行い、すべてのwmaファイルを消去して、好きな名前を付けます。


ところで、現在のディレクトリ内のすべてのファイルのみを変換する場合(他のすべての後続の再帰ディレクトリ全体ではなく)、代わりにこのコマンドを使用できます。

for i in *.wma; do avconv -i "$i" "${i/.wma/.mp3}"; done

そしてもちろん、現在のディレクトリのwmaファイルのみを削除するには、次のコマンドを使用します。

rm *.wma
1
mchid