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

我在论坛上尝试了不同的选项,但大多数都已经过时了(ffmpeg告诉我它,就像-sameq选项一样)。 我试图理解文档,但我不能。

我想知道如何使用ffmpeg从wma递归转换为mp3,例如输出中的最大比特率为192kbps(但如果原始为128kbps则不是192)

我有除非14K wma文件在许多目录中传播。 所以,我不想动它们。 只需转换它们保留文件名和元数据,并删除它们,如果可以读取要从我可以创建的txt文件转换的文件列表,每行一个文件。 有了这个,我会设法进行递归搜索,粘贴到它中。

谢谢你的帮助。 还有更多感谢关于Ffmpeg的任何解释。

Caroxo

PS:Soundconverter过去很好,但很慢。 现在既不是其中一个。 在很多情况下,在14.04不起作用,就像我的一样。 我正在使用Soundkonverter,但速度很慢。 所以,这一切都是为了阻止这个建议。 我想学习使用这个强大的ffmpeg! 和CLI

注意:下面的脚本正在进行第一次转换。 但由于任何我无法解释的原因,突然删除了转换中的wma,而没有离开mp3。 所以,我再次改为“未解决”(以防止偶尔向别人发出问题)。 问题似乎来自avconv“应用程序提供了无效的,非单调增加的dts到流0:23606> = 21720的muxer”(如果有人有兴趣开发此bug,评论中有pastebins)。 所以,未来没有avconv。

这是我用于ffmpeg当前目录中的所有文件的命令(如果名称中有空格,则工作)在Mac上,其中brew没有avconv:

for file in *.wma; do ffmpeg -i "${file}" -acodec libmp3lame -ab 192k "${file/.wma/.mp3}"; done 

在终端中,首先使用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 

因此,所有音乐文件夹及其子文件夹都将以mp3格式自动转换其wma音乐。

和以前一样,您可以将其添加到ffmpeg行的末尾以进行文件删除:

 && rm "$file" 

编辑(2017/06/23):不要使rm成为默认值

对于任何版本

我发现用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 

我重写了TheSchwa脚本(感谢TheSchwa!),并进行了以下更改:

  • avprobe检测工作(至少在当前Debian unstable的ffprobe版本2.5.2上)。
  • 不要用rm删除文件(转换器通常不删除文件,这可能是一大惊喜!)。
  • 在脚本中加载wma文件。
  • 丢失二进制文件时的帮助。
 #!/bin/bash which ffmpeg > /dev/null || { echo "Install ffmpeg, with 'sudo apt-get install ffmpeg'" >&2; exit 1; } which avprobe > /dev/null || { echo "Install libav-tools, with 'sudo apt-get install libav-tools'" >&2; exit 1; } output_format=mp3 file=`mktemp` find . -type f | grep -i wma$ > $file readarray -t files < $file for file in "${files[@]}"; do out=${file%.wma}.$output_format 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` ffmpeg -i "$file" -ab "$rate"k "$out" done 

注意:以下内容不适用于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 

然后,一旦validation了文件的质量,就可以运行此命令以递归方式删除或删除原始的.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 

这是一个bash脚本,使用parallel :

 #!/bin/bash parallel -i -j$(nproc) ffmpeg -i {} -acodec libmp3lame -ab 192k {}.mp3 ::: ./*.wma rename 's/.wma//' *.wma.mp3