我应该如何在iPhone上为卡拉OK应用程序突出显示音频文本?

时间:2011-10-12 21:54:05

标签: objective-c ios audio

比如说,我有一个应用程序可以显示一大堆歌词,一次显示3或4行。现在,我想触发音频文件开始播放,然后用音频本身突出显示歌词。有点像从一个词反弹到另一个词的弹跳球。

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

知道最好的方法吗?如果我不得不每隔一秒检查一下这个词是否应该改变,我会认为它可能会对处理器产生负担,但我不知道如何能够触发它。

2 个答案:

答案 0 :(得分:6)

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

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

虽然设计需要一点点,但实现一个带有NSTimer的项目,同时开始播放你的歌曲。实现项目,以便每次按下屏幕时,将上一个时间间隔的偏移量插入NSMutableSArray,然后将其写入文件。现在,运行项目并通过在每个单词演唱时按下来为单词创建时间戳。 (这假设你已经知道你要预先实现的歌曲和歌唱速度不是太强烈)。好的...现在你有了你的元数据。

我建议首先尝试弹跳球,因为已经描述了实现,我看到了你想要实现的几个问题。最值得注意的是,(我可能会误解),但我不认为UIlabel / NSString有任何方法可以突出显示子字符串。这意味着您可能需要为每个单词制作一个标签,这可能会变得非常乏味......所以请查看该视频,希望您能从中获得一些信息。祝好运!

答案 1 :(得分:-1)

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

请注意,您实际上可以在主线程上安排一个函数;你不必检查这个词是否有变化。您可以使用:

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

我不完全确定内存问题,但我用它在我的应用程序中播放录制的midi文件。我只是根据metaData安排changeWord函数。

至于制作元数据,我不知道除了暴力之外你还能用什么方法。必须有一些预先写好的元数据;毕竟,还有其他卡拉OK应用程序。