Bash脚本将目录中的所有flv文件转换为mp3

时间:2012-04-10 05:26:16

标签: bash ffmpeg whitespace

到目前为止,这是我的代码。

#!/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文件的名称中拾取了空格并抛出一个错误,说它不在目录中。如何使它使用整个文件名而不是空格前的第一个单词?

4 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分: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结尾。这会将命令输出和命令错误输出管理为遗忘。然后脚本工作。

还应该注意,程序输出看起来很奇怪,多个文件同时压缩。结果是正确的。

[编辑:注意 - 我有,这使得FFMPEG覆盖现有的MP3文件]

答案 2 :(得分:0)

使用引号。并且不要使用反引号。

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

答案 3 :(得分: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

Rename是可能需要安装的perl包的一部分。