在iOS 5中通过HTTP播放远程MP3文件

时间:2012-01-23 21:06:08

标签: xcode cocoa-touch

我正在尝试在我的Xcode项目中播放一个远程MP3文件,但是下面的实现,使用MPMoviePlayerController对我不起作用并且抛出异常。

  

当关键值观察者仍然存在时,AVPlayerItem被释放   在它注册。

我的.h文件

#import <MediaPlayer/MediaPlayer.h>

@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;

我的.m文件

@synthesize moviePlayer = _moviePlayer;

- (void)playEnglish
{
 NSURL *url = [NSURL URLWithString:_audioUrlEnglish];
 _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];

 [[NSNotificationCenter defaultCenter] addObserver:self
 selector:@selector(moviePlayBackDidFinish:)
 name:MPMoviePlayerPlaybackDidFinishNotification
 object:_moviePlayer];

 _moviePlayer.controlStyle = MPMovieControlStyleDefault;
 _moviePlayer.shouldAutoplay = YES;
 [self.view addSubview:_moviePlayer.view];
 [_moviePlayer setFullscreen:YES animated:YES]; 
}


- (void) moviePlayBackDidFinish:(NSNotification*)notification {
 MPMoviePlayerController *player = [notification object];
 [[NSNotificationCenter defaultCenter] 
 removeObserver:self
 name:MPMoviePlayerPlaybackDidFinishNotification
 object:player];

 if ([player
 respondsToSelector:@selector(setFullscreen:animated:)])
 {
 [player.view removeFromSuperview];
 }
}

1 个答案:

答案 0 :(得分:1)

您已为播放器指定了合成属性,但您可以直接指定给ivar。

而不是:

__moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];

你应该:

MPMoviePlayer *aPlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
[self setMoviePlayer:aPlayer];

这将确保您的对象被正确保留(如果您使用自动引用计数)。如果没有这个,看起来您的播放器没有被保留,这可以解释您的错误。

此外,您还在代码中的其他几个位置分配/访问实例变量。 Cocoa中的最佳实践通常可以避免直接触及ivars(有一些例外,但是使用ARC时更少,而且我没有看到任何值得直接分配的示例)。