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

Met*_*uru 8 audio objective-c ios

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

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

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

小智 7

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

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

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

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


Dan*_*son -1

我会选择元数据选项,因为我不知道识别歌手何时改变歌词有多容易。(即尖叫、刺痛等)

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

[self performSelector:@selector(changeWord) withObject:self afterDelay:metaData.nextChangeTime]
Run Code Online (Sandbox Code Playgroud)

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

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