使用 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 文件一起保存。
我想将旧的 *.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 文件一起保存。