3

создать встроенный MPMoviePlayerController константы выглядит внутри моего метода loadView:Набор ContentURL из MPMoviePlayerController дважды

self.moviePlayerController = [[[MPMoviePlayerController alloc] init] autorelease]; 

// add to view, setup moviePlayerController's view frame, etc 

И я могу позже загрузить фильм пользователь выбирает таким образом:

NSURL *fileUrl = ... 
self.moviePlayerController.contentURL = fileUrl; 

и все прекрасно работает.

Однако, если я снова установить contentURL:

NSURL * fileUrl2 = ... self.moviePlayerController.contentURL = fileUrl2;

Это не работает, даже если fileUrl2 == fileUrl1.

Когда я изменить contentURL, я получаю следующее playbackState и Loadstate:

После первого setContentURL:

Loadstate == играть | playthroughOK

playbackState == играть

После моего второго setContentURL:

playbackState == остановился

Loadstate == неизвестную

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

Спасибо!

ответ

9

В моей первоначальной версии я разрешал просмотр фильмов только через встроенные элементы управления. Если бы я заставил фильм, чтобы начать играть сразу же после установки contentURL, все работало хорошо:

self.moviePlayerController.contentURL = fileUrl; 
[self.moviePlayerController play]; 

Однако это не поведение я хотел. Я обнаружил, что, когда

-[MPMoviePlayerController play] 

называется,

-[MPMoviePlayerController prepareToPlay] 

вызывается автоматически.По-видимому, prepareToPlay необходимо вызвать для отображения встроенных элементов управления и начального кадра фильма. Кажется, что это вызвано автоматически в первый раз, когда вызывается setContentURL.

Итак, я просто изменил свой вызов setContentURL на следующее, и все сработало.

self.moviePlayerController.contentURL = fileUrl; 
[self.moviePlayerController prepareToPlay]; 
+0

Часы отладки сокращены до одной строки кода :) Большое спасибо за публикацию, я бы никогда не пробовал это. – elibud

1

документация для contentURL состояний собственности следующие:

Если установить это свойство в то время воспроизведения фильма, что делает паузу кино и новый фильм начинается загрузка. Новый фильм начинает играть в начале.

Так что вы испытываете не ожидаемое поведение. Вы можете получить и проверить журнал ошибок для MPMoviePlayerController, используя его свойство errorLog.

+1

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