我想将旧的* .wma文件转换为* .mp3。为此我找到了一个使用mplayer + lame转换的短脚本(在这里找到:https://askubuntu.com/questions/508625/python-v2-7-requires-to-install-plugins-to-play-media-files-of-the-following-t)。
这在单个目录中工作正常。现在我想以这种方式改进它,它能够与'find'一起使用。它旨在找到* .wma文件,然后调用脚本将该文件转换为* .mp3。
这是脚本:
FILENAME=$1
FILEPATH="$(dirname $1)"
BASENAME="$(basename $1)"
mplayer -vo null -vc dummy -af resample=44100 -ao pcm:waveheader "$FILENAME"
lame -m j -h --vbr-new -b 320 audiodump.wav -o "`basename "$FILENAME" .wma`.mp3"
echo "Path: $FILEPATH" # just to see if its correct
echo "File: $BASENAME" # just to see if its correct
rm -f audiodump.wav
rm -f "$FILENAME"
目前我正在处理这个问题,脚本将转换后的* .mp3放在控制台正在使用的目录中(例如/ home / user /而不是/ home / user / files / * .wma来自)。
如何让脚本将新的* .mp3放入与* .wma相同的目录中? 如果我想在脚本中使用'mv',我会遇到* .wma文件名中的嵌入空格。
感谢任何提示。我想过将IFS设置为制表符或换行符,但是如果有更好的方法可以解决这个问题,我会更加努力。
答案 0 :(得分:1)
问题是basename
正在剥离 .wma
扩展名和导致该文件的路径。而你只想要.wma
剥离。
所以答案不是使用basename
,而只是自己剥离.wma
(使用Parameter Expansion)。
outfile=${FILENAME%.wma}
lame -m j -h --vbr-new -b 320 audiodump.wav -o "$outfile.mp3"
(请注意,我使用了小写$outfile
。通常$ALL_CAPS
变量是为shell / terminal / environment保留的,应该在脚本中避免使用。)
答案 1 :(得分:1)
这里有一些使用ffmpeg进行转换的东西(在使用ffprobe确定bit_rate应该是什么之后)。它基于我在(https://askubuntu.com/questions/508278/how-to-use-ffmpeg-to-convert-wma-to-mp3-recursively-importing-from-txt-file)中发现的东西。但我没有访问avprobe,所以不得不寻找替代方案。
首先导航到包含所有文件的目录,然后从shell运行以下命令:
find . -type f | grep wma$ > wma-files.txt
完成后,您可以将其放入脚本并运行它:
#!/usr/bin/env bash
readarray -t files < wma-files.txt
ffprobe=<your_path_here>/ffprobe
ffmpeg=<your_path_here>/ffmpeg
for file in "${files[@]}"; do
out=${file%.wma}.mp3
bit_rate=`$ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 "$file"`
$ffmpeg -i "$file" -vn -ar 44100 -ac 2 -ab "$bit_rate" -f mp3 "$out"
done
这将保存mp3文件和wma文件。