2011-10-12 24 views
7

舉例來說,我有一個應用程序可以一次顯示3到4行歌詞。現在,我想觸發一個音頻文件開始播放,然後用音頻本身爲歌詞加亮。有點像從一個字跳到另一個字的彈跳球。我應該如何使用iPhone上的卡拉OK應用程序突出顯示帶有音頻的文本?

我能想到的唯一的事情就是我需要創建元數據以跟隨每個音頻文件,以便我可以啓動一個與音頻文件並行運行的計時器。或者iOS中的音頻播放器可能會暴露自己的運行計時器,並且我可以在某些點觸發突出顯示的單詞進行更改?

任何想法最好的方法來做到這一點?如果我必須每隔一秒檢查一次這個詞是否應該改變,我會認爲它可能會對處理器造成負擔,但我不知道如何才能觸發它。

+0

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

回答

-1

我會選擇元數據選項,因爲我不知道說歌手改變單詞時會有多容易。 (即screamo,sting等)

請注意,您實際上可以在主線程上調度一個函數;你不必檢查單詞是否改變。您可以使用:

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

我不完全確定內存問題,但我用它在我的應用程序中回放錄製的MIDI文件。我只是安排基於元數據的changeWord函數。

至於製作元數據,我不確定你可以使用除蠻力以外的其他方法。必須有一些預先寫入的元數據;畢竟,還有其他的卡拉OK應用程序。

5

不是我所知道的最佳答案,但是在使用Core Animation的WWDC 2011視頻之一中討論了非常類似的解決方案。

找到名爲Core Animation Essentials的視頻(應該是iTunes U上用於WWDC 2011的視頻421)。這個例子應該在29分鐘左右。基本上情況是,有一個彈奏歌曲的歌曲正在播放。該項目談到如何使用一個有趣的想法動畫到字詞的時間和位置...

雖然這需要一點點設計,但實現一個項目與NSTimer和你的歌同時開始。實現這個項目,所以每次按下屏幕時,都會將上一個時間間隔的偏移量插入到NSMutableSArray中,然後寫入文件。現在,運行該項目,並在每個單詞播放時按下時間戳。 (這裏假定你已經知道你要預先執行什麼歌曲,並且歌唱速度不是太激烈)。好的...現在你有了你的元數據。

我會建議首先嚐試彈跳球的事情,因爲實施已經描述,以及我看到你試圖實施的一些問題。最值得注意的是,(我可能會錯),但我不認爲UIlabel/NSString有任何方法來突出顯示子字符串。這意味着你可能必須爲每個單詞製作一個標籤,這可能會非常乏味......所以看看這個視頻,希望你能從中得到一些東西。祝你好運!

相關問題