Воспроизведение мультимедийного контента в последовательности - PullRequest
2 голосов
/ 15 августа 2010

Привет, у меня есть NSArray, содержащий много «мультимедийных действий», как я их называю, объектов, которые инкапсулируют некоторый мультимедийный контент, такой как фильмы и фотографии. Я хотел бы «воспроизвести» их по очереди, ожидая, когда каждый закончил, прежде чем вызвать другого.

Каков наилучший способ управления продолжительностью каждой операции перед вызовом следующей? (для фотографии представьте UIAlertView, который отклоняется через несколько секунд, для фильма вместо этого представьте MPMoviePlayerController)

Я уже вызываю метод, который сканирует массив с помощью операции NSO.

ВАЖНО: Похоже, что MPMovieController не воспроизводит (интерфейс даже не появляется) независимо от того, вызывается ли он внутри NSOperation. Кто-нибудь еще сталкивался с этой проблемой?

ОБНОВЛЕНИЕ Использование performSelectorOnMainThread: заставляет MPMoviePlayer работать должным образом

1 Ответ

1 голос
/ 20 августа 2010

Это решение, которое мне удалось найти. Я публикую это на тот случай, если кому-то будет интересно.

Сначала я поместил все свои «мультимедийные действия» в NSOperationQueue и установил maxConcurrentOperationCount на 1, поэтому я уверен, что они будут выполняться асинхронно из основного потока, но только по одному в FIFO порядок (это очень важно, если вы хотите, чтобы ваш контент не перекрывался на экране).

Затем для каждого действия я активирую его определенным образом, в зависимости от его класса / вида. Предположим, есть три вида действий:

  1. UIAlertViews подклассы
  2. MPMoviePlayerController типа
  3. Фоновые действия (действия, которые не связаны с мультимедийным контентом, для мгновенного отображения в текущем представлении

Для первых двух я использую NSNotifications для управления очередью, поскольку я не знаю, когда контент прекратит воспроизведение или будет отклонен пользователем (предположительно, на ощупь). Итак, для каждого из них я:

  • Приостановить выполнение очереди с помощью setSuspended:YES
  • Добавить наблюдателя для соответствующей NSNotification
  • Воспроизведение контента
  • Опубликовать уведомление, когда они закончат играть
  • Удалить наблюдателя и снова запустить очередь с помощью setSuspended:NO

Для UIAlertView уведомление публикуется с performSelector:withObject:afterDelay: с указанием времени, в течение которого оно должно отображаться, или после двойного нажатия. Для MPMovieController вместо этого он запускается автоматически и называется MPMoviePlayerPlaybackDidFinishNotification. И UIAlertView, и тип MP должны воспроизводиться в основном потоке.

Третий тип может быть набором команд, просто выполняемых в NSInvocationOperation, помещенном в очередь. Так что я даже могу создать такие действия, как «ожидание», которые приостанавливают выполнение очереди на несколько секунд

...