对于 iPhone 上的卡拉 OK 等应用程序,我应该如何定时突出显示带有音频的文本?
Posted
技术标签:
【中文标题】对于 iPhone 上的卡拉 OK 等应用程序,我应该如何定时突出显示带有音频的文本?【英文标题】:How should I time highlighting of text with audio for a karaoke like application on iPhone? 【发布时间】:2011-10-12 21:54:04 【问题描述】:例如,我有一个应用程序可以显示歌词块,一次显示 3 或 4 行。现在,我想触发一个音频文件开始播放,然后用音频本身对歌词的突出显示进行计时。有点像从一个词跳到另一个词的弹跳球。
我唯一能想到的是,我需要创建与每个音频文件一起使用的元数据,以便我可以启动一个与音频文件一起运行的计时器。或者,ios 中的音频播放器可以公开自己的运行计时器,我可以触发突出显示的单词在某些点发生变化?
知道最好的方法吗?如果我必须每秒检查单词是否应该更改,我认为这可能会对处理器造成负担,但我不知道如何触发它。
【问题讨论】:
卡拉 OK 使用的是 MIDI 格式吗?或者您使用的是 mp3 之类的东西? 【参考方案1】:不是我所知道的最佳答案,但在 WWDC 2011 的一个视频中使用 Core Animation 讨论了一个非常相似的解决方案。
找到名为 Core Animation Essentials 的视频(应该是 iTunes U 上 WWDC 2011 上的视频 421)。该示例应该在第 29 分钟左右。基本上,场景是有一个球在播放歌曲的歌词上弹跳。该项目讨论了如何使用一个有趣的想法为单词的时间和位置设置动画......
虽然设计需要一点时间,但使用 NSTimer 和您的歌曲同时开始实施一个项目。实施该项目,以便每次在屏幕上按下时,都会将上次时间间隔的偏移量插入到 NSMutableSArray 中,然后将其写入文件。现在,运行该项目并在每个单词被唱出时通过按下来为单词制作时间戳。 (这假设你已经事先知道你要实现什么歌曲,并且演唱速度不是太激烈)。好的...现在您有了元数据。
我建议首先尝试弹跳球,因为已经描述了实现,我发现您尝试实现的内容存在一些问题。最值得注意的是,(我可能弄错了),但我认为 UIlabel/NSString 没有任何方法可以突出显示子字符串。这意味着您可能必须为每个单词制作一个标签,这可能会变得非常乏味......所以请查看该视频,希望您能从中获得一些东西。祝你好运!
【讨论】:
【参考方案2】:我会选择元数据选项,因为我不知道识别歌手何时改变单词会有多容易。 (即尖叫、刺痛等)
请注意,您实际上可以在主线程上调度一个函数;您不必检查单词是否已更改。您可以使用:
[self performSelector:@selector(changeWord) withObject:self afterDelay:metaData.nextChangeTime]
我不完全确定内存问题,但我用它在我的应用程序中播放录制的 MIDI 文件。我只是根据元数据安排 changeWord 函数。
至于制作元数据,除了蛮力之外,我不确定您可以使用什么方法。必须有一些预先写好的元数据;毕竟还有其他的卡拉OK应用。
【讨论】:
以上是关于对于 iPhone 上的卡拉 OK 等应用程序,我应该如何定时突出显示带有音频的文本?的主要内容,如果未能解决你的问题,请参考以下文章