设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3467|回复: 7
打印 上一主题 下一主题

[讨论] 大家看看这个获取MP3文件基本信息的脚本

[复制链接]

Lv4.逐梦者 (版主)

梦石
0
星屑
9497
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

跳转到指定楼层
1
发表于 2014-11-21 16:31:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 RyanBern 于 2014-11-21 21:10 编辑

@精灵使者 的要求,写了一个能够获取MP3文件信息的脚本。因为脚本还不是很成熟,不能完全解决MP3文件的信息获取问题,所以放在了RM讨论区,等完善之后可以考虑放到技术发布区。不过需要这个脚本的人不多,放上去也不知有什么用。

问题的核心在于如何获取MP3文件内容,我查了一堆资料(这里不得不吐槽我们的百度,所有的资料都是copy-paste的,而且都有错误),最后只能照样子写了一个。经过多次测试,该脚本不能处理所有MP3的信息,而且有时候会报错。大家看看我是不是遗漏了些什么。

由于XP的版本限制,无法读取中文信息,这点大家也帮忙想想有没有解决方法。

我参考的官方MP3数据结构网址:
www.id3.org

RUBY 代码复制
  1. module Audio
  2.   class Mp3Data
  3.     attr_accessor :title
  4.     attr_accessor :artist
  5.     attr_accessor :album
  6.     attr_accessor :year
  7.     attr_accessor :comments
  8.     attr_accessor :genre
  9.     attr_accessor :track
  10.   end
  11.   def initialize
  12.     @title = ""
  13.     [url=home.php?mod=space&uid=1953775]@artist[/url] = ""
  14.     @album = ""
  15.     @year = ""
  16.     @comments = ""
  17.     @genre = ""
  18.     @track = ""
  19.   end
  20.   def self.get_playing_bgm_info_mp3_id3v2
  21.     filename = "Audio/BGM/" + $game_system.playing_bgm.name + ".mp3"
  22.     file = File.open(filename, "r")
  23.     info = Mp3Data.new
  24.     buffer = file.read(10)
  25.     if buffer[0...3] == "ID3"
  26.       size = buffer[6...10]
  27.       total_size = (size[0]&0x7F) * 0x200000 + (size[1]&0x7F) * 0x4000 + (size[2]&0x7F) * 0x80 +(size[3]&0x7F)
  28.       while total_size > 0
  29.         buffer = file.read(10)
  30.         break if buffer.nil?
  31.         total_size -= 10
  32.         tag = buffer[0...4]
  33.         size = buffer[4...8]
  34.         current_size = size[0] * 0x1000000 + size[1]* 0x10000 + size[2] * 0x100 + size[3]
  35.         break if current_size == 0
  36.         buffer = file.read(current_size)
  37.         total_size -= current_size
  38.         case tag
  39.         when "TIT2"
  40.           info.title = buffer.gsub(/[^0-9A-Za-z_ ]+/, "")
  41.         when "TPE1"
  42.           info.artist = buffer.gsub(/[^0-9A-Za-z_ ]+/, "")
  43.         when "TYER"
  44.           info.year = buffer.gsub(/[^0-9]+/, "")
  45.         when "TRCK"
  46.           info.track = buffer.gsub(/[^0-9\/]/, "")
  47.         when "TALB"
  48.           info.album = buffer.gsub(/[^0-9A-Za-z_ ]+/, "")
  49.         when "TCON"
  50.           info.genre = buffer.gsub(/[^0-9A-Za-z_ ]+/, "")
  51.         when "COMM"
  52.           info.comments = buffer.gsub(/[^0-9A-Za-z_ ]+/, "")
  53.         end
  54.       end
  55.     end
  56.     file.close
  57.     return info
  58.   end
  59. end

评分

参与人数 1星屑 +100 收起 理由
恐惧剑刃 + 100 塞糖

查看全部评分

Lv4.逐梦者

梦石
0
星屑
9275
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

2
发表于 2014-11-21 18:24:15 | 只看该作者
你可以拿永夜的原声带试试看···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2207
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

3
发表于 2014-11-21 18:53:10 | 只看该作者
吐槽一下,楼主查技术类资料竟然用百度……

点评

wiki吧···  发表于 2014-11-21 22:17
下次用google  发表于 2014-11-21 20:58
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

4
发表于 2014-11-21 23:36:11 | 只看该作者
本帖最后由 精灵使者 于 2014-11-22 00:07 编辑

那个,不需要获取MP3的ID3标签啦。
只需要获取正在播放的文件名就可以了的说。
补充:
精灵想要的是这种效果:
获取BGM音乐名,然后当BGM/ME变化的时候,在右下角显示BGM的名称(可以使用 - 符号分割,类似于: 01 - Title Theme - Kan Gao.mp3)之类的
也就是说屏幕右下角会显示:
BGM:
01
Title Theme
Kan Gao

点评

MP3格式感觉有硬伤。中间无法连续,有不可冲突的中断  发表于 2014-11-22 00:05
需要MP3格式啊,ME好像也可以用MP3吧?  发表于 2014-11-21 23:54
另外精灵想做成类似于和显示地图名脚本一样的效果的说。  发表于 2014-11-21 23:53
ME其实也可以么?  发表于 2014-11-21 23:52
这个针对ID3v2版本的,因为用ID3v2版本的最多,ID3v1版本的读取非常简单,但是好多MP3都没有ID3v1信息  发表于 2014-11-21 23:45
回复 支持 反对

使用道具 举报

路路 该用户已被删除
5
发表于 2014-11-22 01:32:41 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9497
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

6
 楼主| 发表于 2014-11-22 10:34:41 | 只看该作者
本帖最后由 精灵使者 于 2014-11-24 18:37 编辑
精灵使者 发表于 2014-11-21 23:36
那个,不需要获取MP3的ID3标签啦。
只需要获取正在播放的文件名就可以了的说。
补充:


写了一个循环显示BGM的脚本,没有做ME的,可以试试效果。
RUBY 代码复制
  1. class BGM_Display
  2.   def initialize
  3.     @bgm = nil
  4.     @me = nil
  5.     @waiting = 0
  6.     @sprite1 = Sprite.new
  7.     @sprite2 = Sprite.new
  8.     @sprite1.bitmap = Bitmap.new(160, 32)
  9.     @sprite2.bitmap = Bitmap.new(160, 224)
  10.     @sprite2.src_rect = Rect.new(0, 0, 160, 32)
  11.     self.x = 480
  12.     self.y = 416
  13.     self.z = 999
  14.     refresh
  15.   end
  16.   def refresh
  17.     if @me == nil || @me.name ==""
  18.       if @bgm == nil || @bgm.name == ""
  19.         @sprite2.bitmap.clear
  20.         return
  21.       end
  22.       @sprite1.bitmap.clear
  23.       @sprite1.bitmap.draw_text(0, 0, 160, 32, "BGM:")
  24.       @texts = @bgm.name.split(/-/)
  25.     else
  26.       @sprite1.bitmap.clear
  27.       @sprite1.bitmap.draw_text(0, 0, 160, 32, "ME:")
  28.       @texts = @me.name.split(/-/)
  29.     end
  30.     ([email]0...@texts.size[/email]).each do |i|
  31.       draw_item(i)
  32.     end
  33.   end
  34.   def draw_item(i)
  35.     x = 4
  36.     y = 32 * (2 * i + 1)
  37.     @sprite2.bitmap.fill_rect(x, y, 160, 32, Color.new(0,0,0,0))
  38.     @sprite2.bitmap.draw_text(x, y ,160, 32, @texts[i])
  39.   end
  40.   def x=(x)
  41.     @sprite1.x = x
  42.     @sprite2.x = x
  43.   end
  44.   def y=(y)
  45.     @sprite1.y = y
  46.     @sprite2.y = y + 32
  47.   end
  48.   def z=(z)
  49.     @sprite1.z = z
  50.     @sprite2.z = z
  51.   end
  52.   def update
  53.     if $game_temp.playing_me != nil
  54.       @me = $game_temp.playing_me
  55.       $game_temp.playing_me = nil
  56.       refresh
  57.       @sprite2.src_rect.y = 0
  58.       return
  59.     end
  60.     if $game_system.playing_bgm != @bgm
  61.       @bgm = $game_system.playing_bgm
  62.       refresh
  63.       @sprite2.src_rect.y = 0
  64.       return
  65.     end
  66.     if @waiting > 0
  67.       @waiting -= 1
  68.       return
  69.     end
  70.     @sprite2.src_rect.y += 1
  71.     if @sprite2.src_rect.y >= 192
  72.       @sprite2.src_rect.y -= 192
  73.       if @me != nil
  74.         @me = nil
  75.         refresh
  76.       end
  77.     end
  78.     if @sprite2.src_rect.y % 64 == 32
  79.       @waiting = 40
  80.     end
  81.   end
  82.   def dispose
  83.     @sprite1.bitmap.dispose
  84.     @sprite2.bitmap.dispose
  85.     @sprite1.dispose
  86.     @sprite2.dispose
  87.   end
  88. end
  89.  
  90. class Game_Temp
  91.   attr_accessor :playing_me
  92. end
  93.  
  94. class Game_System
  95.   alias rb_me_play_20141124 me_play
  96.   def me_play(me)
  97.     $game_temp.playing_me = me
  98.     rb_me_play_20141124(me)
  99.   end
  100. end
  101.  
  102. class Scene_Map
  103.   alias rb_main_20141122 main
  104.   def main
  105.     @bgm_display = BGM_Display.new
  106.     rb_main_20141122
  107.     @bgm_display.dispose
  108.   end
  109.   alias rb_update_20141122 update
  110.   def update
  111.     @bgm_display.update
  112.     rb_update_20141122
  113.   end
  114. end

点评

http://rm.66rpg.com/forum.php?mod=viewthread&tid=374031 召唤来看更新……  发表于 2014-11-25 15:40
好的!精灵立刻拿这个去测试去!没准会有新的发现呢。  发表于 2014-11-24 18:11
这个可以成为最终版了,窗口可以实时显示播放的BGM和ME,如果是BGM的话是循环显示,如果是ME的话就显示一次。  发表于 2014-11-24 14:04
其实BGM和ME都可以只显示一次就可以了。  发表于 2014-11-23 17:36
刚才想了下,打算这么处理:如果是ME的话就只滚动显示1次,无论ME是否播放完毕都切回BGM显示,这样做也是没有办法,毕竟ME和BGM播放机制不同  发表于 2014-11-23 09:49

评分

参与人数 1星屑 +100 收起 理由
精灵使者 + 100 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
4
星屑
4454
在线时间
6784 小时
注册时间
2014-1-6
帖子
5052

开拓者

7
发表于 2014-11-25 11:52:11 | 只看该作者
可恶~,居然在这讨论这些我看不懂的东西!!

脚本!!,看我不把你学会!!
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
8
发表于 2014-11-28 15:54:50 | 只看该作者
本帖最后由 寒冷魔王 于 2014-11-28 16:01 编辑

看楼主,猜语言,猜错了= =
还以为会用C#呢……

另外作为一名Java菜鸟想问一下Ruby怎样调用用Java写好的程序?
百度说是实例加载jar的,不过那个需不需要Java环境?

如果加载需要运行Java的话,我还是再学一学C#吧= =
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-20 16:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表