如何在iPhone上以卡拉OK风格显示歌词?

时间:2011-01-28 15:01:49

标签: iphone cocoa-touch ios core-audio

我目前正在创建一个播放音乐的应用。我想添加一个功能,在音乐播放时显示音乐歌词,文本的当前位置标记为与歌曲中的当前位置相匹配。 Bouncing Ball效果,就像你在歌曲播放时在每个卡拉OK屏幕上看到的一样。 我一直在寻找扩展我的caf文件,添加“字符串块”,然后再读出它们。这是正确的方法吗?有没有人知道更好/更容易/更正常的方式来实现我的目标? 由于我不确定如何同步所有内容,我会很高兴任何建议,代码示例或有用的评论。也许有人之前做过这件事,并乐意为我提供建议。

提前感谢所提供的任何信息。

艾伦

3 个答案:

答案 0 :(得分:2)

目前大多数卡拉OK应用都使用.Kar文件扩展名。这是一个略带剔除的MIDI文件,带有一些注释,文件大小非常小。

我不知道你在哪里开始阅读它。你可以问这些家伙:http://www.ikaraokeapp.com/

大多数小开发者都很乐意帮助其他人。

答案 1 :(得分:0)

您应该可以通过MusicPlayer API执行此操作,特别是MusicTrack MIDIMetaEvent,假设midi类型音乐可以接受。

MIDIMetaEvent

Describes a MIDI metaevent such as lyric text, time signature, and so on.

typedef struct MIDIMetaEvent {
   UInt8    metaEventType;
   UInt8    unused1;
   UInt8    unused2;
   UInt8    unused3;
   UInt32   dataLength;
   UInt8    data[1];
} MIDIMetaEvent;

或者,您可能会在iD3 metadata处查看存储歌词和时间信息方面取得一些进展。

无论哪种方式,都会有很多文件准备将歌词和时间安排到音乐文件中。

答案 2 :(得分:0)

执行此操作的标准方法是使用其他答案建议的kar文件扩展名。以下是一些更多细节。

.kar扩展名表示标准midi文件包含歌词信息。要制作卡拉OK播放器,您需要做两件事:播放midi文件的乐器部分并显示歌词。

这可以通过两种方式实现。您可以使用内置的MusicPlayer播放midi文件,然后从虚拟端点访问歌词信息:here

您需要访问代码为0x01(文本)或0x05(歌词)的midi元消息。这些消息将歌词数据存储为一系列十六进制数字,其中每个十六进制数字代表一个ascii字符。

此方法允许您播放MIDI文件并访问歌词。问题是你需要能够提前显示歌词,以便用户在播放之前阅读它们。

要执行此操作,您可以手动解析midi文件:here

您需要循环播放MIDI文件并使用时间戳提取文本歌词。然后你可以提前显示一段歌词,并在歌词到期时改变颜色或做一个弹跳球效果。