Как мне выделить время для текста со звуком для караоке-приложения на iPhone? - PullRequest
7 голосов
/ 13 октября 2011

Скажем, например, у меня было приложение, которое показывало бы фрагменты текста по 3 или 4 строки за раз. Теперь я хочу запустить аудиофайл, чтобы начать воспроизведение, а затем выделить время для выделения текста самим аудио. Вроде как прыгающий мяч, который отскакивает от одного слова к другому.

Единственное, о чем я могу думать, - это то, что мне нужно будет создать метаданные для каждого аудиофайла, чтобы я мог запустить таймер, работающий рядом с аудиофайлом. Или, может быть, аудиоплеер в iOS может выставлять свой собственный таймер запуска, и я мог вызвать изменение выделенного слова в определенных точках?

Любая идея, лучший способ сделать это? Я бы подумал, что процессор может облагаться налогом, если бы мне приходилось каждую секунду проверять, должно ли слово измениться, но я не знаю, как я мог бы вызвать его иначе.

Ответы [ 2 ]

6 голосов
/ 07 ноября 2011

Не самый лучший ответ, который я знаю, но очень похожее решение обсуждалось в одном из видеороликов WWDC 2011 с использованием Core Animation.

Найдите видео с названием Core Animation Essentials (должно быть видео 421 на iTunes U для WWDC 2011). Пример должен быть около минуты 29. По сути, сценарий состоял в том, что был какой-то шар, подпрыгивающий над лирикой, которую играли на песню. Проект рассказывает о том, как оживить время и положение над словами, используя интересную идею ...

Хотя на разработку потребуется немного времени, реализуйте проект с NSTimer и одновременно начинайте свою песню. Реализуйте проект таким образом, чтобы при каждом нажатии на экран смещение от последнего временного интервала вставлялось в массив NSMutableSArray, который затем записывается в файл. Теперь запустите проект и создайте временные метки для слов, нажимая вниз, когда каждое слово спето. (Это предполагает, что вы уже знаете, какие песни вы собираетесь исполнить заранее, и скорость пения не слишком высокая). Хорошо, теперь у вас есть метаданные.

Я бы рекомендовал сначала попробовать прыгающий мяч, потому что реализация уже описана, и я вижу пару проблем с тем, что вы пытаетесь реализовать. В частности, (я могу ошибаться), но я не думаю, что в UIlabel / NSString есть какие-либо методы для выделения подстрок. Это означает, что вам, возможно, придется сделать ярлык для каждого отдельного слова, что может стать очень утомительным ... Так что посмотрите это видео и, надеюсь, вы сможете что-то из этого извлечь. Удачи!

0 голосов
/ 13 октября 2011

Я бы выбрал опцию метаданных, поскольку я не знаю, как легко было бы, скажем, распознать, когда певец меняет слова.(например, screamo, sting и т. д.)

Обратите внимание, что вы можете запланировать функцию в главном потоке;Вам не нужно проверять, изменилось ли слово.Вы можете использовать:

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

Я не совсем уверен относительно проблем с памятью, но я использую его для воспроизведения записанных миди-файлов в моем приложении.Я бы просто запланировал функцию changeWord на основе метаданных.

Что касается создания метаданных, я не уверен, какой метод вы могли бы использовать, кроме грубой силы.Там должны быть некоторые заранее написанные метаданные;В конце концов, есть и другие приложения для караоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...