Асинхронная загрузка MPMoviePlayerController не имеет значения длительности - PullRequest
3 голосов
/ 18 июня 2011

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

-(void)createPlayer {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

MPMoviePlayerController *temp = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"URLString"]];

[self performSelectorOnMainThread:@selector(passPlayer:) withObject:temp waitUntilDone:YES];

[temp release];
[pool release];
}

-(void)passPlayer:(MPMoviePlayerController*)temp {    
player = [temp retain];
player.movieSourceType = MPMovieSourceTypeStreaming;
//player.view.hidden = YES;
//[self.view addSubview:player.view];
[player prepareToPlay];
}

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

double duration = player.duration;
NSLog(@"duration: %f, duration);

console output:  duration: nan

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

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 03 июля 2011

Прежде всего, не создавайте объекты пользовательского интерфейса в неосновном потоке. Все операции пользовательского интерфейса должны выполняться в главном потоке, иначе произойдут странные вещи. Например, фильм никогда не загружается, а NAN возвращается на время.

Во-вторых, initWithContentURL: вероятно является асинхронным, иначе не было бы уведомлений, чтобы сообщить вам, когда фильм действительно был загружен. Просто создайте контроллер, как обычно, подпишитесь на соответствующие уведомления, чтобы узнать, когда обновляется статус, а затем немедленно проверьте статус на тот случай, если фильм оказался локальным файлом или уже кэширован, поэтому загрузка могла происходить синхронно. .

3 голосов
/ 18 июня 2011

Это происходит потому, что проигрыватель фильмов не смог рассчитать продолжительность.Если вы подпишетесь на уведомление MPMovieDurationAvailableNotification, вы будете уведомлены, если и когда будет определено значение.

MPMovieDurationAvailableNotification

Это уведомление опубликованокогда определяется продолжительность объекта фильма.Объектом уведомления является сам объект MPMoviePlayerController.Нет словаря userInfo.Значение длительности отражается в свойстве duration контроллера фильма.

Источник: Документация Apple

2 голосов
/ 18 июня 2011

Из официального документа:

Обсуждение Если продолжительность фильма неизвестна, значение этого свойства равно 0,0.Если впоследствии определяется продолжительность, это свойство обновляется и публикуется уведомление MPMovieDurationAvailableNotification.

Поэтому используйте NSNotificationCenter для регистрации уведомления MPMovieDurationAvailableNotification.

...