我使用内置的MPMoviePlayerController播放视频。使用两个MPMoviePlayerControllers时遇到问题(请注意,没有两个视频同时播放)。我可以在第一个控制器上播放任意数量的视频,完成后将其丢弃,然后分配另一个MPMoviePlayerController。一旦在第二个控制器上设置了controlStyle,我就会得到一个SIGABRT

由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“电影播放器​​的激活状态错误(1)

我在线搜索,并在堆栈溢出时发现了类似的问题。那个人说他忘了删除播放完毕的通知。我相信我已经使用[[NSNotificationCenter defaultCenter] removeObserver:self]正确地完成了此操作;

我仍然崩溃。相当令人沮丧!

我不明白为什么只要两个控制器不能同时播放,就不可能使用它们。我宁愿不必为了使视频正常工作而深入研究AVPlayer的内容。

谢谢!

编辑:注释掉controlStyle分配仍然会导致崩溃。下面是发布的调用栈,以及该类中的一些重要方法。

- (void) makePlayer;
{
[player.view removeFromSuperview];
[player release];
player = [MPMoviePlayerController new];
player.view.frame = self.bounds;
player.view.hidden = YES;
player.controlStyle = MPMovieControlStyleNone;
player.scalingMode = MPMovieScalingModeNone;
[self addSubview: player.view];
}

- (void) dealloc;
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
[player.view removeFromSuperview];
[player release];
[super dealloc];
}

- (void) setMovieByName: (NSString *) name;
{
[self makePlayer];
player.shouldAutoplay = NO;
[player setContentURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: name ofType: @"mov"]]];
[player stop];
[player prepareToPlay];
[[NSNotificationCenter defaultCenter] removeObserver: self];
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(movieDimensionsKnown:) name:MPMovieNaturalSizeAvailableNotification object: player];
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackStateChanged:) name:MPMoviePlayerPlaybackStateDidChangeNotification object: player];
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object: player];
}

- (void) playbackFinished: (NSNotification *) n
{
player.view.hidden = YES;
if ([delegate respondsToSelector: @selector(moviePlayerImageViewPlaybackDidFinish:)])
    [delegate moviePlayerImageViewPlaybackDidFinish: self];
}

最佳答案

我想我看到你的问题了。您要释放player甚至没有分配它。基本上,编译器第一次浏览您的代码时,会看到player的保留计数为-1(由于release调用),然后在分配时再次变为0(由于new呼叫)。因此,当您第一次尝试设置任何属性时,没有对象将属性设置为(player永远不会有保留计数1)。
您应该做的是检查player是否存在,并且仅当它已经存在时,才释放它。

尝试对您的makePlayer方法进行此更改:

- (void) makePlayer {

if (player != nil) {

[player.view removeFromSuperview];
player = nil;
[player release];

}

player = [MPMoviePlayerController new];
player.view.frame = self.bounds;
player.view.hidden = YES;
player.controlStyle = MPMovieControlStyleNone;
player.scalingMode = MPMovieScalingModeNone;
[self addSubview: player.view];
}


编辑:做了些微更改。 player是一个实例变量,因此您实际要做的就是检查它是否已设置为对象。

关于objective-c - MPMoviePlayer的激活状态错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6783596/

10-10 20:49