2

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

#!/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

4 回答 4

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 。这会将命令输出和命令错误输出通过管道传输到遗忘中。然后脚本工作。

还应注意,程序输出看起来异常混乱,同时压缩了多个文件。结果将是正确的。

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

于 2014-01-26T12:07:17.953 回答
2

尝试这个:

`ffmpeg -i "${I}" -acodec copy  "${I/%.flv/.mp3}"`
于 2012-04-10T05:28:04.390 回答
0

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

ffmpeg -i "${I}" -acodec copy  "${I%.flv}".mp3
于 2012-04-10T05:28:39.010 回答
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 包的一部分。

于 2012-04-10T05:50:02.757 回答