2012-05-02 9 views
4

私はインターネットに接続して再生しようとすると、通常、私は "インターネットに接続していません"と表示して、初めてのアプリ起動時にバックグラウンドで同じ音楽を再生するためにmpmovieplayerコントローラを持っています私は、インターネットに接続した後、すべてのソリューションを再生ボタンをクリックしたときにエラーiPhoneのネットワーク接続性をチェックした後にアプリがクラッシュする

*** 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. 
} 

アプリがクラッシュするのですか?

+0

コードの書式設定に少し時間をかけてください。それは判読不能に近いです。あなたが読者のためにそれを作るのが簡単になればなるほど、あなたは良いと役に立つ答えを得る可能性が高くなります。 – Till

+0

考えられる原因はたくさんあります。ステップ1; viewDidAppearであなたのプレイヤーを初期化し、まだinitWithNibには入れないでください。 – Till

+0

@コードを正しく配置しないと申し訳ありません。バックグラウンドアクティビティのコードAVAudioSessionを追加したときに問題(エラー)が発生していると思います。実際にプレイヤーとそのプロパティをどこで初期化しましたか? –

答えて

2

これは静的プレーヤのためだと思います。実装では

@property (nonatomic,retain) MPMoviePlayerController *player; 

:INITで

@synthesize player = _player; 

:ムービープレーヤ

利用のプロパティを使用してみてください

MPMoviePlayerController *plyr = [MPMoviePlayerController alloc] init]; 
self.player = plyr; 
[plyr relaease]; 
あなたのコードで

[controller setContentURL:movieURL]; 
+0

私は試みましたが、問題はまだ残っています... –

+0

"AVPlayerItemはAVPlayerの複数のインスタンスに関連付けることはできません" –

+0

therを使用しているプロパティは何ですか? – Saad

1

これはプレーヤーが既に存在している可能性があると思います。

はこのような何かを追加しよう:

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"]]; 
+0

申し訳ありませんが問題はまだ存在します。「AVPlayerItemは複数のAVPlayerインスタンスに関連付けることはできません」というエラーメッセージが表示されるのは、初めてアプリケーションがネットワークに接続されていないときだけです。 –

0

前に、私はわからないんだけどあなたはリンクを確認しました

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]; 

多分あなたが最初にprepareToPlay、その後、サブビューとしてビューに追加する必要があります。..

私はわからないが、これが役に立てば幸い:リンゴからのコードが含まれてMPMoviewPlayerController Class Reference

..

8

私は同じ問題を抱えていました。私のために働いた解決策は、指示を削除することでした。

player.movieSourceType = MPMovieSourceTypeStreaming; 
+3

ありがとうございます!これが私を助けたのです - 単純なinit(initWithContentURLのintead)で初期化し、次にmovieSourceTypeを設定してからcontentURLを設定します。 –

+0

ありがとう@PavelAlexeev、それは私が必要だった。 – htafoya

関連する問題