如何使用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