使用mplayer,lame和find通过SHELL脚本将* .wma转换为* .mp3

时间:2016-01-05 01:17:40

标签: bash shell mp3 wma

我想将旧的* .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设置为制表符或换行符,但是如果有更好的方法可以解决这个问题,我会更加努力。

2 个答案:

答案 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文件。