2012-04-10 13 views
2

これまでのコードです。ディレクトリ内のすべてのflvファイルをmp3に変換するBashスクリプト

#!/bin/bash 
#James Kenaley 
#Flv to Mp3 directory converter 

find /home/downloads -iname "*.flv" | \ 
while read I; 
do 
    `ffmpeg -i ${I} -acodec copy ${I/%.flv/.mp3}` 
    echo "$I has been converted" 
done 

flvファイルの名前に空白が含まれていて、ディレクトリにないというエラーがスローされます。スペースの前の最初の単語だけではなく、ファイル名全体をどのように使用するのですか?

`ffmpeg -i "${I}" -acodec copy "${I/%.flv/.mp3}"` 

答えて

2

ffmpegはフォークされたスレッドで実行されるため、単純なバッチ処理では奇妙な動作が発生する可能性があります。推奨されるバッチループでffmpegを実行している場合は、コマンドやコマンドエラーの出力を制御して干渉しないようにする必要があります。

あなたはこれを実行し、他のすべての項目が正しく変換取得しているが、残りのエラーは、ループ内でこのffmpegの呼び出しを使用してみた場合:

ffmpeg -y -i "${I}" -acodec mp3 -ar 22050 -f wav "${I/%.3gp/.mp3}" > /dev/null & 2> /dev/null 

お知らせ> DEV/nullに& 2>/devの/最後にはnull。これはコマンド出力をパイプし、コマンドエラー出力を忘却に変換します。その後、スクリプトが動作します。

複数のファイルを同時に圧縮すると、プログラムの出力が奇妙に混乱して見えることにも注意してください。結果は正しいでしょう。

は、[EDIT:これは、FFMPEG OVERWRITE既存MP3 FILESを作り、私が持っている-y注]それは動作しますが、今でも多くの不可解な事が起こる...それは停止し、その後2つのファイルを変換し

2

はこれを試してみてください。逆引用符は使用しないでください。

ffmpeg -i "${I}" -acodec copy "${I%.flv}".mp3 
+0

。 – UnbrandedTech

+0

ええ...いいえ。私は問題が何であるかを正確に見るためにいくつかの 'echo'ステートメントを振りかけるでしょう。 – Amadan

0

使用引用符:

0

いずれかの変換を行うために、短いスクリプトを呼び出すと、1回のパスで名前を変更:

adhoc.sh:

$file="$1" 
ffmpeg -i "$file" -acodec copy "${file/%.flv/.mp3}" 

はそれを呼び出す:

find /home/downloads -iname "*.flv" -exec ./adhoc.sh {} ";" -ls 

または変換します。

find /home/downloads -iname "*.flv" -exec ffmpeg -i {} -acodec copy {}.mp3 ";" -ls 

以降名前を変更します。

rename 's/.flv.mp3/.mp3/' /home/downloads/*.flv.mp3 

名前の変更は、インストールが必要な場合がありますPerlパッケージの一部です。

関連する問題