【问题标题】:Ruby mp3 Id3 parsingRuby mp3 Id3 解析
【发布时间】:2010-11-01 15:11:30
【问题描述】:

目前我正在处理一个音乐项目,处理用户 mp3 上传。问题是我找不到对所有文件都能正常工作的 id3 库。 我尝试过 id3-rubyMp3Info 库,但它们都没有给我始终如一的正确结果。 例如,最常见的问题:

  • 错误的流参数(比特率和采样率,有时是持续时间)
  • 不支持扩展标签

我决定添加一个表单,用户可以在其中提供可选信息,例如艺术家和标题;这有点帮助,但并没有完全解决问题。

对于 ruby​​,什么是最有用和最强大的 ID3 库?

【问题讨论】:

  • 你能发布一个你需要支持的标签列表吗?谢谢。

标签: ruby mp3 id3


【解决方案1】:

http://www.hakubi.us/ruby-taglib/

我将它用于一个项目,效果很好。 taglib 的包装器,非常便携。

【讨论】:

  • 我将它用于我的整个 MP3 库并且没有任何问题。不过我没有对比特率/采样率做任何事情,所以我不能说。
  • 这个图书馆仍然活跃……太棒了。
【解决方案2】:

我用过这个:

http://ruby-mp3info.rubyforge.org/

gem install ruby-mp3info(为 Mac 或 *nix 添加规则 sudo

有一些 rdoc 文档,很好。不利的一面是,我不太喜欢使用大写的字段名称,这似乎过于关注保留规范中的名称。也许我应该破解一些别名。无论如何,这个示例脚本会扫描我的音乐库并计算标题中的单词:

require 'mp3info'

count = 0
words = Hash.new { |h, k| h[k] = 0 }
Dir.glob("E:/MUSIC/**/*.mp3") do |f|
  count += 1
  Mp3Info.open(f) do |mp3info|
    title = mp3info.tag2.TIT2
    next unless title
    title.split(/\s/).each { |w| words[w.downcase] += 1 }
  end
end
puts "Examined #{count} files"
words.to_a.sort{ |a, b| b[1] <=> a[1] }[0,100].each { |w| puts "#{w[0]}: #{w[1]}" }

【讨论】:

  • 感谢您的建议。但是界面看起来很难。我想要类似 id3lib-ruby 提供的东西。例如tag = ID3Lib::Tag.new('test.mp3') tag.title #test_title tag.title = 'new_title' tag.udpate! #test.mp3 的标题更新为 new_title
【解决方案3】:

截至 2019 年,最佳答案是:

所有其他库早已无人维护。

Krists Ozols 的 ID3Tag 区别特征

  • 只读
  • 可以读取 v1.x、v2.2.x、v2.3.x、v2.4.x 标签
  • 支持 UTF-8、UTF-16、UTF-16BE 和 ISO8859-1 编码
  • 最后更新于 2018 年 7 月
  • 纯红宝石

Moumar 的 ruby​​-mp3info 区别特征

  • 读写
  • 写id3v2标签只支持2.3版本
  • id3v2 标签始终以 UTF-16 编码编写
  • 上次更新时间:2017 年 4 月
  • 纯红宝石

taglib-ruby 的区别特征

  • 读写
  • 多种格式,不只是 Mp3
  • 读/写 ID3v1 和 ID3v2,包括 ID3v2.4 和 Unicode
  • 上次更新时间为 2018 年 5 月
  • well-maintained C++ library 的绑定

【讨论】:

    【解决方案4】:

    http://id3lib-ruby.rubyforge.org/

    我特别喜欢这个,你也可以给文件写标签。

    【讨论】:

    • 是的,但有时这个库不能正常工作,所以我决定改用更好的东西
    • 貌似不支持utf-8。否则它很整洁。
    • 它基于不再维护的 id3lib。对于同一作者(我)的最新库,请尝试taglib-ruby
    【解决方案5】:

    id3tag 是另一种选择。示例:

    require "id3tag"
    
    mp3_file = File.open('/path/to/your/favorite_song.mp3', "rb")
    tag = ID3Tag.read(mp3_file)
    puts "#{tag.artist} - #{tag.title}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2011-12-01
      • 2020-12-14
      • 2012-10-22
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多