递归地将所有第二层 mp3 转换为第三层并更新 ID3

Posted

技术标签:

【中文标题】递归地将所有第二层 mp3 转换为第三层并更新 ID3【英文标题】:Convert recursively all layer II mp3's to layer III and also update ID3 【发布时间】:2014-04-27 08:08:58 【问题描述】:

我处于http://nerdbynature.de/s9y/?316 中描述的情况。我有一个文件

$ file foo.mp3
foo.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer II, v1, 192 kbps, 44.1 kHz, Stereo

我想将layer II 转为layer III 以及ID3 version 2.3.0 转为ID3 version 2.4.0。对于单个文件,所描述的方式非常完美。

$ mv foo.mp3,mp2
$ lame --mp2input foo.mp2 foo.mp3
$ mid3iconv -d foo.mp3
$ rm foo.mp2
$ file foo.mp3
foo.mp3: Audio file with ID3 version 2.4.0, contains: MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, JntStereo

    我现在如何编写一个(最好是 shell)脚本,该脚本在包含音乐的巨大文件夹中递归运行,并检查每个文件。如果使用layer II,则使用lame 将其转换为layer III,如果使用ID3 version 2.3.0,则使用mid3iconv 将其转换为ID3 version 2.4.0

    另外,我如何确保我不会失去质量(我在上面看到输入为 192kbps 而输出仅为 128kbps。

【问题讨论】:

【参考方案1】:

这应该让你开始

find -name '*.mp3' | while read ip
do
  file "$ip" | grep -q '2.4.0.*III' && continue
  ib=$ip%.*
  ffmpeg -i "$ip" -q:a 0 "$ib"-iii.mp3
done

注意到我没用过 -print0,可能是个好主意。

-q:a 0 将保持质量。

当您使用输出扩展.mp3时,FFmpeg 默认为第三层编解码器@

FFmpeg 写入 2.4.0 metadata 默认情况下

【讨论】:

感谢您的建议!我想知道为什么使用 ffmpeg 实际上更好——我不能在 ubuntu 上简单地安装它。我可以用上面使用的代码替换 ffmpeg 行吗?还是有其他缺点? @ChristianStump 我认为在 Ubuntu 上你可以使用 avconv 作为替代品 它现在可以工作了,谢谢!我还有两个问题:1)如果满足两个条件中的任何一个,file "$ip" | grep -q '2.4.0.*III' && continue 是否确保它被处理? 2) 我处理了一些测试文件,发现输入为 192 kbps,而输出仅为 64 kbps(使用file foo.mp3)——同时,文件大小增加了 1.3 倍。这是假定的行为吗? @ChristianStump ffmpeg 将运行,除非两个条件都满足。如果您在费率方面遇到问题,可以改用-b:a 192k 再次感谢! (以防其他人也想这样做:)我也尝试了 192k,但这大大降低了质量。

以上是关于递归地将所有第二层 mp3 转换为第三层并更新 ID3的主要内容,如果未能解决你的问题,请参考以下文章

图论专题训练 (更新中)

Mysql优化基础

POJ 5542 树状数组优化DP

ADS 下 flash 烧写程序原理及结构

三层交换配置及RIP动态路由

sqlserver的CTE实现递归查询