приложение вылетает после проверки доступности сети в iphone?

у меня есть mpmovieplayercontroller для воспроизведения онлайн-музыки и avaudiosession для воспроизведения той же музыки в фоновом режиме, когда приложение запускается в первый раз без доступа к сети, обычно я показывает «нет подключения к Интернету», когда я пытался после подключения к Интернету и воспроизведения, это показывает ошибку

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem cannot be associated with more than one instance of AVPlayer'

мой код здесь

static MPMoviePlayerController *player=nil;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
    {
        // Custom initialization

        [MainViewController  stopStreaming];

        player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"http://159.253.145.180:7104"]];
        player.movieSourceType = MPMovieSourceTypeStreaming;
        player.view.hidden = YES;
        [self.view addSubview:player.view];
        [player prepareToPlay];
        [player play];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSError *setCategoryErr = nil;
    NSError *activationErr  = nil;
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryErr];
    [[AVAudioSession sharedInstance] setActive: YES error: &activationErr];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
    newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];

    Reachability* reachabile = [Reachability reachabilityWithHostName:@"www.apple.com"];
    NetworkStatus remoteHostStatus = [reachabile currentReachabilityStatus];

    if(remoteHostStatus == NotReachable) 
    {
        NSLog(@"not reachable");
        UIAlertView *notReachableAlert=[[UIAlertView alloc]initWithTitle:@"NO INTERNET CONNECTION" message:@"This Application Need Internet To Run" delegate:self cancelButtonTitle:@"Okay Buddy" otherButtonTitles: nil];
        notReachableAlert.delegate=self;
        [notReachableAlert show];
        [notReachableAlert release];
    }

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackStateDidChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerLoadStateChanged:) name:MPMoviePlayerLoadStateDidChangeNotification object:player];

    MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:CGRectMake(22, 320, 200, 15)] autorelease];
    volumeView.center = CGPointMake(152,372);
    [volumeView sizeToFit];
    [self.view addSubview:volumeView];    // Do any additional setup after loading the view from its nib.
}

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


person Neeraj Neeru    schedule 02.05.2012    source источник
comment
Вы действительно должны потратить немного больше времени на форматирование кода. Это близко к нечитаемому. Чем проще вы сделаете это для читателя, тем больше вероятность, что вы получите хорошие и полезные ответы.   -  person Till    schedule 03.05.2012
comment
Есть много возможных причин. Шаг 1; инициализируйте свой плеер в viewDidAppear, а не в initWithNib.   -  person Till    schedule 03.05.2012
comment
@ Прошу прощения за неправильное расположение кодов, я думаю, что проблема (ошибка) возникает, когда я добавляю код AVAudioSession для фоновой активности, на самом деле, где я инициализировал проигрыватель и его свойства?   -  person Neeraj Neeru    schedule 03.05.2012
comment
Инициируйте плеер в viewDidAppear (как было сказано ранее), инициируйте сеанс перед инициализацией плеера. В основном просто делайте все, что вы сейчас делаете в viewDidAppear.   -  person Till    schedule 03.05.2012


Ответы (4)


Я думаю, это из-за статичного плеера. Попробуйте использовать свойство movieplayer

Использовать:

@property (nonatomic,retain) MPMoviePlayerController *player;

В реализации:

@synthesize player = _player;

В инициализации:

MPMoviePlayerController *plyr = [MPMoviePlayerController alloc] init];
self.player = plyr;
[plyr relaease];

В вашем коде

[controller setContentURL:movieURL];
person Saad    schedule 02.05.2012
comment
AVPlayerItem не может быть связан более чем с одним экземпляром AVPlayer. - person Neeraj Neeru; 03.05.2012
comment
какое свойство ты там используешь? - person Saad; 03.05.2012

У меня такая же проблема. Решение, которое сработало для меня, было удалить инструкцию

player.movieSourceType = MPMovieSourceTypeStreaming;
person nicolimo86    schedule 23.07.2012
comment
Спасибо! Вот что мне помогло — инициализация с помощью простой инициализации (вместо initWithContentURL), затем установка movieSourceType, а затем установка contentURL. - person Pavel Alexeev; 17.10.2012
comment
Спасибо @PavelAlexeev, это было мне нужно. - person htafoya; 07.02.2013

Я думаю, это может быть связано с уже существующим игроком.

попробуйте добавить что-то вроде этого:

if (player != nil) {
    [player release];
    player = nil; //i prefer to do both, just to be sure.
}

поставить его после

[MainViewController  stopStreaming];  

и перед

player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"http://159.253.145.180:7104"]];
person Manuel    schedule 02.05.2012
comment
извините, но проблема все еще существует, она показывает, что AVPlayerItem не может быть связан более чем с одним экземпляром AVPlayer, эта ошибка возникает только при первом запуске приложения без сети. - person Neeraj Neeru; 03.05.2012

я не уверен, что это правильно, но если вы проверили ссылку

Справочник по классу MPMoviewPlayerController

который включает в себя код от Apple:

MPMoviePlayerController *player =
        [[MPMoviePlayerController alloc] initWithContentURL: myURL];
[player prepareToPlay];
[player.view setFrame: myView.bounds];  // player's frame must match parent's
[myView addSubview: player.view];
// ...
[player play];

возможно, вам нужно сначала подготовитьToPlay, а затем добавить его в свое представление в качестве подвида.

я не уверен, но надеюсь, что это поможет ..

person iremk    schedule 02.05.2012