1

我想将旧的 *.wma 文件转换为 *.mp3。为此,我找到了一个使用 mplayer + lame 进行转换的简短脚本(在此处找到:https ://askubuntu.com/questions/508625/python-v2-7-requires-to-install-plugins-to-play-media -files-of-the-following-t )。

这在单个目录中工作正常。现在我想以这种方式对其进行改进,使其能够与“查找”一起使用。它的目的是找到一个 *.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 设置为制表符或换行符,但如果有更好的方法来处理这个问题,我会很高兴。

4

2 回答 2

2

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

于 2017-06-23T07:45:55.417 回答
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/终端/环境保留的,应该在脚本中避免使用。)

于 2016-01-05T02:20:24.513 回答