使用 mplayer、lame 和 find 通过 SHELL-script 将 *.wma 转换为 *.mp3

Converting *.wma to *.mp3 by SHELL-script with mplayer, lame, and find

我想将旧的 *.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=
FILEPATH="$(dirname )"
BASENAME="$(basename )"

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 设置为制表符或换行符,但我不知道是否有更好的方法来处理这个问题。

问题是 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 保留的,在脚本中应该避免使用。)

这是使用 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 文件一起保存。