升级到 iOS 5 后 MPMoviePlayerController 不起作用
Posted
技术标签:
【中文标题】升级到 iOS 5 后 MPMoviePlayerController 不起作用【英文标题】:MPMoviePlayerController doesn't work after upgrading to iOS 5 【发布时间】:2011-10-17 15:56:18 【问题描述】:此代码在 iPad 4.3 模拟器上完美运行:
NSString *source = [mediaObject objectForKey:@"source"];
NSString *videoPath = [NSString stringWithFormat:@"%@/%@", path, source];
NSURL *videoUrl = [NSURL fileURLWithPath:videoPath];
MPMoviePlayerController *videoPlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoUrl];
videoPlayer.shouldAutoplay = NO;
videoPlayer.view.frame = CGRectMake(xPos, yPos, width, height);
[backgroundImageView addSubview:videoPlayer.view];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoPlaybackStateDidChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:videoPlayer];
但它不适用于 iPad 5 模拟器。我得到一个没有电影和播放控件的黑框。
我阅读了有关 MPMoviePlayerController 的 Apple 更改日志,但我没有发现任何关于此问题的信息。你能帮帮我吗?
【问题讨论】:
【参考方案1】:我用这种方式解决了问题:在我的头文件中我写了:
MPMoviePlayerController *moviePlayer;
使用此属性:
@property(nonatomic, strong) MPMoviePlayerController *moviePlayer;
在我初始化电影播放器的方法中:
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:movieUrl];
self.moviePlayer = player;
似乎将播放器分配给一个属性可以“保存”播放器。但是不要问我为什么……
【讨论】:
谢谢。我花了几个小时试图弄清楚这一点。对 ARC 有更深入了解的人可能想权衡一下为什么这需要成为一项资产才能保持活力。 您需要一个属性,以便保留视图控制器 - 仅仅因为 backgroundImageView 保留其视图并不会使其保留视图控制器。【参考方案2】:您没有提及您尝试播放的 URL 类型,但是,如果它是 HTTP 实时流媒体资源(.m3u8 文件),那么请注意 ios 5.0 似乎已经加强了对内容的验证m3u8 索引文件。
具体来说,我发现:
没有单个段的长度可以超过#EXT-X-TARGETDURATION
值的两倍;
#EXTINF
值(以秒为单位的段长度)现在只能是整数值。
如果其中一个问题是您的问题,在 iOS 5.0 模拟器下运行您的应用程序应该会在调试器控制台中显示警告。
【讨论】:
你好。该视频是一个简单的 .mp4 文件,位于“Documents”应用文件夹的子文件夹中。 真机也存在问题。 @Martin Kenny:我已经发布了一个类似的问题,你能调查一下吗? LINK【参考方案3】:对于 iOS5 上的 HLS,TARGETDURATION 值实际上不是目标时长,但需要是最大时长。所以应该设置为文件中最大的段。
【讨论】:
以上是关于升级到 iOS 5 后 MPMoviePlayerController 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
升级到 iOS 5 后 MPMoviePlayerController 不起作用
升级到 Flutter 到 2.5.0 后,无法从 Android Studio 的 iOS 模拟器运行应用程序
升级到 Xcode 4.2/iOS 5 后,类别中的方法引发异常
IBM Worklight 6.1 - 升级到 v6.1 后,iOS 5 中的适配器调用失败