如何使用Ffmpeg递归地将wma转换为mp3,从txt文件导入?

如何使用Ffmpeg递归地将wma转换为mp3,从txt文件导入?

我尝试了论坛上提供的不同选项,但大多数选项都已过时(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

相关内容