![如何使用Ffmpeg递归地将wma转换为mp3,从txt文件导入?](https://linux22.com/image/859589/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Ffmpeg%E9%80%92%E5%BD%92%E5%9C%B0%E5%B0%86wma%E8%BD%AC%E6%8D%A2%E4%B8%BAmp3%EF%BC%8C%E4%BB%8Etxt%E6%96%87%E4%BB%B6%E5%AF%BC%E5%85%A5%EF%BC%9F.png)
我尝试了论坛上提供的不同选项,但大多数选项都已过时(ffmpeg 会告诉我,例如使用 -sameq 选项)。我试图理解文档,但我做不到。
我想知道如何使用 ffmpeg 将 wma 递归转换为 mp3,例如输出的最大比特率为 192kbps(但如果原始比特率为 128kbps,则不是 192)
我有 14K wma 文件,但这些文件分散在许多目录中。所以,我不想移动它们。只需转换它们并保留文件名和元数据,然后删除它们,如果可以从我可以创建的 txt 文件中读取要转换的文件列表,每行一个文件。有了这个,我将设法进行递归搜索,然后粘贴到其中。
感谢您的帮助。更感谢您对 Ffmpeg 的解释。
卡罗索
PS:Soundconverter 以前很好用,但是速度很慢。现在两者都不行。在很多情况下,比如我的系统,它在 14.04 中都不能用。我正在使用 Soundkonverter,但是速度很慢。所以,这一切都是为了防止出现这些建议。我想学习使用这个强大的 ffmpeg!和 CLI
注意:下面的脚本在第一次转换时是有效的。但是由于我无法解释的任何原因,转换时突然删除了 wma,而没有留下 mp3。因此,我再次将其更改为“未解决”(以防止偶尔给其他人带来问题)。问题似乎来自 avconv“应用程序在流 0 中向多路复用器提供了无效、非单调递增的 dts:23606 >= 21720”(如果有人有兴趣开发这个错误,评论中有 pastebins)。因此,将来不会有 avconv。
答案1
这是我在 Mac 上对当前目录中的所有文件(如果名称中有空格则有效)使用 ffmpeg 的命令,其中 brew 没有 avconv:
for file in *.wma; do ffmpeg -i "${file}" -acodec libmp3lame -ab 192k "${file/.wma/.mp3}"; done
答案2
在终端中,首先使用 浏览到包含所有音乐的文件夹cd
,例如:
cd /home/username/music/wma-to-convert
以下将列出当前文件夹和所有以“wma”结尾的子文件夹中的所有文件,并将列表存储在名为的文本文档中wma-files.txt
:
find . -type f | grep wma$ > wma-files.txt
或者,您可以根据需要手动创建文本文件。然后在文本编辑器中输入以下内容并将其保存在 的同一目录中wma-files.txt
,例如将其命名为conv-script
:
#!/usr/bin/env bash
readarray -t files < wma-files.txt
for file in "${files[@]}"; do
out=${file%.wma}.mp3
probe=`avprobe -show_streams "$file" 2>/dev/null`
rate=`echo "$probe" | grep "^bit_rate" | sed "s:.*=\(.*\)[0-9][0-9][0-9][.].*:\1:" | head -1`
ffmpeg -i "$file" -ab "$rate"k "$out"
done
您可能必须在脚本上设置可执行位:
chmod +x conv-script
然后运行它:
./conv-script
您也可以选择将其添加到行尾ffmpeg
,但要小心:
&& rm "$file"
对于那些无法使用 avprobe 的人,您可以使用 ffprobe 来执行等效操作(即获取 bit_rate)。操作方法如下:
代替:
probe=`avprobe -show_streams "$file" 2>/dev/null`
rate=`echo "$probe" | grep "^bit_rate" | sed "s:bit_rate=\([0-9]\+\)[0-9]\{3\}:\1:" | head -1`
和:
rate=`ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 "$file"`
完成此操作后,您的所有文件都应开始转换,并且应删除 wma 原始文件!这对于将 flac 文件转换为 mp3 非常有用。不幸的是,我没有任何 wma 可以测试,但我希望它对这些文件也应该很好。
注意:虽然我预计不会出现任何问题,但将一些文件复制到新目录并对其进行测试是个好主意。
如果您计划经常将 Wma 转换为 mp3,下面的脚本会自动转换并删除作为参数给出的文件夹中的所有内容,它对上述内容进行了一点改进。此外,ffmpeg 命令与第一个建议的命令略有不同,如果第一个命令不起作用,请使用下面的命令。
#!/usr/bin/env bash
cd "$1"
find . type f | grep wma$ > wma-files.txt
readarray -t files < wma-files.txt
for file in "${files[@]}"; do
out=${file%.wma}.mp3
ffmpeg -i "$file" -map_metadata 0:s:0 "$out"
done
rm wma-files.txt
然后,您只需在终端中输入以下内容来调用它:
./convScript /home/username/music
这样,所有音乐文件夹及其子文件夹中的 wma 音乐都会自动转换为 mp3。
与以前一样,您可以将其添加到行尾ffmpeg
以删除文件:
&& rm "$file"
编辑(2017/06/23):不要rm
默认
答案3
对于任何版本
我找到了一种使用 mplayer 实现此目的的简洁方法。此脚本将重命名文件以删除文件名称中的所有空格,并将递归地将当前目录中的所有 .wma 文件转换为 .mp3:
#!/bin/bash
for f in *.wma; do
newname=`echo $f | tr ' ' '_' `
mv "$f" $newname
f=$newname
mplayer $f -novideo -ao pcm:file=tmp.wav
lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}
rm -f tmp.wav
done
这是一个单行版本:
for f in *.wma; do; newname=`echo $f | tr ' ' '_' `; mv "$f" $newname; f=$newname; mplayer $f -novideo -ao pcm:file=tmp.wav; lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}; rm -f tmp.wav; done
答案4
注意:以下内容不适用于 15.04、15.10 或 16.04
第一的:
ffmpeg 已弃用14.04无论如何你现在应该使用avconv
。
sudo apt-get install avconv
使用此命令递归地将 wma 文件转换为 mp3:
for i in `find . -type f -name '*.wma'`; do avconv -i "$i" "${i/.wma/.mp3}"; done
然后,一旦您验证了文件的质量,您可以运行此命令以递归方式移除或删除原始 .wma 版本:
for i in `find . -type f -name '*.wma'`; do rm "$i"; done
下一个:
以下是如何在脚本中使用该命令(名为“wma2mp3”:
sudo nano /usr/local/bin/wma2mp3
将其复制并粘贴到文件中:
#!/bin/bash
for i in `find . -type f -name '*.wma'`; do avconv -i "$i" "${i/.wma/.mp3}"; done
按ctrl+o然后按enter保存文件并使用ctrl+x退出。
然后,使用以下命令使该文件可执行:
sudo chmod +x /usr/local/bin/wma2mp3
现在您可以简单地运行命令wma2mp3
来递归地将所有 wma 文件转换为 mp3。
只需对脚本执行相同操作即可删除所有 wma 文件并将其命名为您想要的任何名称。
顺便说一句,如果您只想转换当前目录中的所有文件(而不是所有其他后续递归目录),则可以使用此命令:
for i in *.wma; do avconv -i "$i" "${i/.wma/.mp3}"; done
当然,要仅删除当前目录中的 wma 文件,只需使用此命令:
rm *.wma