Video MPMoviePlayerController-黑屏,音频作品
我知道也有人问过类似的问题,但我的问题与其他问题略有不同,我自己还没有找到解决办法 我有一个应用程序,可以故意阻止大部分应用程序的界面旋转。但是,该应用程序确实可以播放视频,并且在该视图上允许旋转 该应用程序已经在商店中使用了一段时间,并按预期运行,但我收到了一些关于视频无法在运行iOS 7的设备上播放的报告(音频确实可以播放)。令人恼火的是我无法复制这个问题(我已经在4s、5和5s上进行了测试)。视频和音频在我的所有设备上都可以正常工作 在“详细视图”屏幕上,有一个播放按钮,该按钮将启动一个新视图的切换,该视图允许全屏视频和旋转- “全屏视频”屏幕是带有MPMoviePlayerController*moviePlayer和(iAction)playMovie的UIViewController;-将自动调用该操作,以便在新视图出现时立即开始视频播放 viewDidLoad看起来像Video MPMoviePlayerController-黑屏,音频作品,video,ios7,mpmovieplayercontroller,Video,Ios7,Mpmovieplayercontroller,我知道也有人问过类似的问题,但我的问题与其他问题略有不同,我自己还没有找到解决办法 我有一个应用程序,可以故意阻止大部分应用程序的界面旋转。但是,该应用程序确实可以播放视频,并且在该视图上允许旋转 该应用程序已经在商店中使用了一段时间,并按预期运行,但我收到了一些关于视频无法在运行iOS 7的设备上播放的报告(音频确实可以播放)。令人恼火的是我无法复制这个问题(我已经在4s、5和5s上进行了测试)。视频和音频在我的所有设备上都可以正常工作 在“详细视图”屏幕上,有一个播放按钮,该按钮将启动一个新
[super viewDidLoad];
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:[[self.detailItem valueForKey:@"exerciseVideo"] description] ofType:@"mov"]];
moviePlayer = [[MPMoviePlayerController alloc]
initWithContentURL:url];
self.moviePlayer.contentURL = url;
NSError *_error = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &_error];
[moviePlayer stop];
[moviePlayer setShouldAutoplay:NO];
[NSTimer scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(playMovie)
userInfo:nil
repeats:NO];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerDidExitFullscreenNotification
object:moviePlayer];
moviePlayer.controlStyle = MPMovieControlStyleDefault;
moviePlayer.shouldAutoplay = YES;
moviePlayer.allowsAirPlay = YES;
[self.view addSubview:moviePlayer.view];
[moviePlayer setFullscreen:YES animated:YES];
这部动作片看起来像
[super viewDidLoad];
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:[[self.detailItem valueForKey:@"exerciseVideo"] description] ofType:@"mov"]];
moviePlayer = [[MPMoviePlayerController alloc]
initWithContentURL:url];
self.moviePlayer.contentURL = url;
NSError *_error = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &_error];
[moviePlayer stop];
[moviePlayer setShouldAutoplay:NO];
[NSTimer scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(playMovie)
userInfo:nil
repeats:NO];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerDidExitFullscreenNotification
object:moviePlayer];
moviePlayer.controlStyle = MPMovieControlStyleDefault;
moviePlayer.shouldAutoplay = YES;
moviePlayer.allowsAirPlay = YES;
[self.view addSubview:moviePlayer.view];
[moviePlayer setFullscreen:YES animated:YES];
有什么理由视频不能播放这些代码吗?我想知道它是否与单个设备上的设置相关(或者如果有其他后台任务,可能与内存相关),但我在这里碰壁,试图解决一个无法复制的问题
如有任何建议,将不胜感激。- 删除不必要的self.moviePlayer.contentURL分配
- 停止使用奇怪的延迟播放(
)schedueledTimer…
- 将所有代码移动到
viewdide:..
- 添加一个标志(例如,
),在进入/离开全屏后防止重新启动播放器(因为这将重新触发该外观事件)self.playerInitialized
- 在
viewDidLoad
- 在
中,检查该标志是否设置为视图显示:…
false
- 如果是
,请从上面的false
viewdide:…
- 在该条件下,将其设置为
true
- 在播放机通知处理程序中,将该标志重置为信号中止/完成播放的
false
- 确保在该点完全取消初始化播放器和所有通知处理程序
- 在
- 删除不必要的self.moviePlayer.contentURL分配
- 停止使用奇怪的延迟播放(
)schedueledTimer…
- 将所有代码移动到
viewdide:..
- 添加一个标志(例如,
),在进入/离开全屏后防止重新启动播放器(因为这将重新触发该外观事件)self.playerInitialized
- 在
viewDidLoad
- 在
中,检查该标志是否设置为视图显示:…
false
- 如果是
,请从上面的false
viewdide:…
- 在该条件下,将其设置为
true
- 在播放机通知处理程序中,将该标志重置为信号中止/完成播放的
false
- 确保在该点完全取消初始化播放器和所有通知处理程序
- 在
self.moviePlayer.contentURL
分配,停止使用奇怪的延迟播放(schedueledTimer…)并将所有代码移动到ViewDidDisplay:…
@直到我将其移动到ViewDidDisplay,每当我按下“完成”按钮,视频就会重新开始(我假设是因为一旦视频停止,ViewDidDisplay会再次被调用,重新开始视频-moviePlayBackDidFinish似乎不会被调用。想法?向viewController添加一个标志,该标志在viewDidLoad中设置为false,在ViewDidDisplay中设置为true。在ViewDidDisplay中将其设置为true之前,启动玩家。只有当该标志设置为false时,才启动init部分。有意义吗?@直到完美为止。它在我所有的设备和模拟器上为我播放,所以我将把它上传到商店,看看它是否解决了问题。非常感谢您的帮助。在我收到最终用户的反馈之前,我不知道它是否有效(因为之前的设置在我的模拟器和设备上也适用!)我会重复我的评论作为一个正确的答案-如果你的用户给出了积极的反馈,那就去接受吧。我很确定你以前使用的解决方案是非常脆弱的,在很多情况下很容易失败。你应该真正避免这样的延迟/延迟呼叫,因为它们通常是完全错误的,只有在所有其他事情失败后才是最后的手段。试试看删除不必要的self.moviePlayer.contentURL
分配,停止使用奇怪的延迟播放(schedueledTimer…),并将所有代码移动到ViewDidDisplay:…
@直到我将其移动到ViewDidDisplay,每当我按下“完成”按钮,视频就会重新开始(我假设是因为一旦视频停止,ViewDidDisplay会再次被调用,重新开始视频-moviePlayBackDidFinish似乎不会被调用。想法?向viewController添加一个标志,该标志在viewDidLoad中设置为false,在ViewDidDisplay中设置为true。在ViewDidDisplay中将其设置为true之前,启动玩家。只有当该标志设置为false时,才启动init部分。有意义吗?@直到完美为止。它在我所有的设备和模拟器上为我播放,所以我将把它上传到商店,看看它是否解决了问题。非常感谢您的帮助。在我收到最终用户的反馈之前,我不知道它是否有效(因为以前的设置也适用于我的simu