2012-04-10 30 views
2

這是我的代碼。Bash腳本將目錄中的所有flv文件轉換爲mp3

#!/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文件的名稱中拾取空格,並拋出一個錯誤,指出它不在目錄中。如何讓它使用整個文件名而不是空格前的第一個單詞?

回答

2

ffmpeg在分叉線程中運行,所以簡單的批處理可能會產生奇怪的行爲。如果您在建議的批處理循環中運行ffmpeg,則應該控制命令和命令錯誤輸出,以免干擾。

如果你運行這一點,並讓所有其他項目正確轉換,但在其他錯誤,請嘗試在循環中使用該ffmpeg的電話:

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

通知的>開發/空& 2>/dev的/ null結束。這將管道命令輸出,並命令錯誤輸出遺忘。然後該腳本起作用。

還應該注意的是,程序輸出看起來奇怪雜亂無章,同時有多個文件壓縮。結果將是正確的。

[編輯:請注意,我有-y,這使得FFMPEG覆蓋現有的MP3文件]

2

試試這個:

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

它的工作原理,但現在更加令人費解的事情發生......它轉換兩個文件,然後停止。 – UnbrandedTech 2012-04-10 05:47:52

+0

呃......不知道。我會撒上一些「回聲」聲明來確切地說明問題所在。 – Amadan 2012-04-10 05:56:13

0

使用引號。並且不要使用反引號。

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

要麼調用一個簡短的腳本,做轉換和重新命名在一個通:

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包的一部分。

相關問題