我应该如何使用iPhone上的卡拉OK应用程序突出显示带有音频的文本?

问题描述:

举例来说,我有一个应用程序可以一次显示3到4行歌词。现在,我想触发一个音频文件开始播放,然后用音频本身为歌词加亮。有点像从一个字跳到另一个字的弹跳球。我应该如何使用iPhone上的卡拉OK应用程序突出显示带有音频的文本?

我能想到的唯一的事情就是我需要创建元数据以跟随每个音频文件,以便我可以启动一个与音频文件并行运行的计时器。或者iOS中的音频播放器可能会暴露自己的运行计时器,并且我可以在某些点触发突出显示的单词进行更改?

任何想法最好的方法来做到这一点?如果我必须每隔一秒检查一次这个词是否应该改变,我会认为它可能会对处理器造成负担,但我不知道如何才能触发它。

+0

你是否在使用MIDI格式的卡拉OK?或者你使用的是类似mp3的东西? –

我会选择元数据选项,因为我不知道说歌手改变单词时会有多容易。 (即screamo,sting等)

请注意,您实际上可以在主线程上调度一个函数;你不必检查单词是否改变。您可以使用:

[self performSelector:@selector(changeWord) withObject:self afterDelay:metaData.nextChangeTime] 

我不完全确定内存问题,但我用它在我的应用程序中回放录制的MIDI文件。我只是安排基于元数据的changeWord函数。

至于制作元数据,我不确定你可以使用除蛮力以外的其他方法。必须有一些预先写入的元数据;毕竟,还有其他的卡拉OK应用程序。

不是我所知道的最佳答案,但是在使用Core Animation的WWDC 2011视频之一中讨论了非常类似的解决方案。

找到名为Core Animation Essentials的视频(应该是iTunes U上用于WWDC 2011的视频421)。这个例子应该在29分钟左右。基本上情况是,有一个弹奏歌曲的歌曲正在播放。该项目谈到如何使用一个有趣的想法动画到字词的时间和位置...

虽然这需要一点点设计,但实现一个项目与NSTimer和你的歌同时开始。实现这个项目,所以每次按下屏幕时,都会将上一个时间间隔的偏移量插入到NSMutableSArray中,然后写入文件。现在,运行该项目,并在每个单词播放时按下时间戳。 (这里假定你已经知道你要预先执行什么歌曲,并且歌唱速度不是太激烈)。好的...现在你有了你的元数据。

我会建议首先尝试弹跳球的事情,因为实施已经描述,以及我看到你试图实施的一些问题。最值得注意的是,(我可能会错),但我不认为UIlabel/NSString有任何方法来突出显示子字符串。这意味着你可能必须为每个单词制作一个标签,这可能会非常乏味......所以看看这个视频,希望你能从中得到一些东西。祝你好运!