MPMoviePlayerLoadStateDidChangeNotification не вызывается - PullRequest
0 голосов
/ 19 августа 2010

Я конвертирую приложение iOS3 в iOS4 и у меня проблемы с проигрывателем фильмов!Я следовал примеру здесь (он мне больше не нужен для работы в iOS3!) И подкласс UIViewController со следующим кодом:

#import "moviePlayer.h"

@implementation moviePlayer
@synthesize mainAppDelegate;
@synthesize mp;

- (id)initWithMovie:(NSString *)moviePath delegate:(id)delegate {
    self.mainAppDelegate = delegate;

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerLoadStateChanged:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:mainAppDelegate selector:@selector(movieFinishedPlaying:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

    self.mp =  [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]];
    [mp setControlStyle:MPMovieControlStyleFullscreen];
    [mp setShouldAutoplay:YES];

    return self;
}

- (void) moviePlayerLoadStateChanged:(NSNotification*)notification {

    NSLog(@"moviePlayerLoadStateChanged");

    // Unless state is unknown, start playback
    if ([mp loadState] != MPMovieLoadStateUnknown) {

        // Remove observer
        [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerLoadStateDidChangeNotification object:nil];

        //Set Landscape and Rotate
        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
        [[self view] setBounds:CGRectMake(0, 0, 480, 320)];
        [[self view] setCenter:CGPointMake(160, 240)];
        [[self view] setTransform:CGAffineTransformMakeRotation(M_PI / 2)];

        //Set frame, add view and play
        [[mp view] setFrame:CGRectMake(0, 0, 480, 320)];
        [[self view] addSubview:[mp view]];
        [mp play];

        //Tell main app that it worked!
        [mainAppDelegate performSelector:@selector(movieLoaded:) withObject:mp];

    } else if ([mp loadState] == MPMovieLoadStateUnknown) {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
        [mainAppDelegate performSelector:@selector(movieLoaded:) withObject:nil];
    }

}

- (void)dealloc {
    [mainAppDelegate release];
    [mp release];
    [super dealloc];
}

@end

moviePath - локальный файлкоторый был загружен и сохранен на устройстве.

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

Я использовал NSLog(@"%@", moviePath); в верхней части init, чтобы увидеть разницу, и ее нет - URL (локальный путь) один и тот же в зависимости от того, что??

1 Ответ

0 голосов
/ 16 октября 2015

Я знаю, что этот вопрос очень старый, но Google привел меня сюда, ища что-то еще. Поскольку ответа нет, а кому-то еще может быть интересно,

MPMoviePlayerLoadStateDidChangeNotification

Специально вызывается ТОЛЬКО во время сетевых загрузок. Согласно документации Apple:

Опубликовано, когда состояние буферизации сети проигрывателя фильмов изменилось. Пользовательского словаря нет.

Чтобы получить текущее состояние загрузки проигрывателя фильмов, откройте его свойство loadState. Киноплеер, состояние которого изменилось, доступен как объект, связанный с уведомлением.

Таким образом, проблема OP в том, что уведомление срабатывает только при загрузке соответствующего файла, работает так, как задумано Apple.

...