我使用MPMoviePlayerController
在我的Application Document文件夹中播放本地文件,该文件已经下载了服务器URL:
itemMoviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];
[self.view addSubview:itemMoviePlayerController.view];
itemMoviePlayerController.fullscreen = YES;
itemMoviePlayerController.movieSourceType = MPMovieSourceTypeFile;
itemMoviePlayerController.initialPlaybackTime = -1.0;
[itemMoviePlayerController play];
当我下载它之后播放.mov
文件时,它显示一个黑色的空白屏幕&应用UI无法使用。
但是如果下次播放相同的本地文件,它可以正常播放。
我甚至验证了playState
& localState
MPMoviePlayerController
他们似乎很好。
黑色空屏可能是什么原因?
答案 0 :(得分:31)
您需要保留MPMoviePlayerController的实例,即作为属性或实例变量。如果您不保留对电影播放器的引用,则会丢失。
答案 1 :(得分:15)
您可以尝试[itemMoviePlayerController prepareToPlay];
在[itemMoviePlayerController play];
Apple首选显示全屏视频的方式是提供模式MPMoviePlayerViewController
(如Hollance所说)。
要呈现它,你应该使用类似的东西:
moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:fileURL];
[self presentMoviePlayerViewControllerAnimated:moviePlayerViewController];
[itemMoviePlayerController play];
您可以在那里阅读,您应该保留对MPMoviePlayerViewController
的引用,以便稍后将其解除
[self dismissMoviePlayerViewControllerAnimated:moviePlayerViewController]
。
答案 2 :(得分:13)
我通过放
来解决这个问题@property (strong, nonatomic) MPMoviePlayerController *moviePlayer;
在我的.h文件中,并在我的所有代码中调用self.moviePlayer
并且它有效!
答案 3 :(得分:7)
您需要使用MPMoviePlayerViewController。注意那里的“视图”一词。
答案 4 :(得分:3)
我希望这会有所帮助。我在项目中解决了这个问题
-(void)startPlayingMovie
{
NSLog(@"startPlayingMovie");
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"Start_video" ofType:@"mov"]];
moviePlayer = [[MPMoviePlayerViewController alloc]
initWithContentURL:url];
moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.width);
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayer.moviePlayer];
moviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone;
moviePlayer.moviePlayer.shouldAutoplay = YES;
[self presentMoviePlayerViewControllerAnimated:moviePlayer];
[moviePlayer.moviePlayer setFullscreen:YES animated:NO];
NSLog(@"endPlayingMovie");
}
答案 5 :(得分:2)
同样的事发生在我身上。事实证明,我曾试图播放电影而UIImagePicker
尚未被解雇。
在我的UIImagePickerDelegate
中,我必须首先关闭UIImagePicker
弹出窗口,然后打开管理ViewController
的{{1}}:
MPMediaPlayerController
答案 6 :(得分:2)
我有同样的问题,这让我发疯。它会在一个视图控制器上工作(音频和视频),但不能在另一个视频控制器上工作(黑屏只有音频)。最后,我所做的只是更改调用的顺序:我只是等到我完成配置电影播放器之后才将其添加到视图中。换句话说,我在调用“play”之前就调用了“addSubview”。
答案 7 :(得分:1)
这是我用来播放网址文件的代码:
MPMoviePlayerViewController *movieViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:contentUrl]];
movieViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
[self presentMoviePlayerViewControllerAnimated:movieViewController];
[movieViewController release];
它对我来说似乎很好。两个注意事项:
movieSourceType
部分,电影开始前会显示黑屏约一秒答案 8 :(得分:0)
我遇到了同样的问题,解决了将正在播放的文件的扩展名从.mpg更改为.mp4的问题。显然MPMoviePlayerController需要一个正确的扩展,但从文档中我不清楚这是一个要求:
支持的格式此类播放支持的任何电影或音频文件 在iOS中。这包括流内容和固定长度文件。 对于电影文件,这通常意味着扩展名为.mov的文件, .mp4,.mpv和.3gp并使用以下压缩之一 标准:
答案 9 :(得分:0)
将设备iOS更新为5.0后,此问题似乎已修复 似乎以前版本的iOS SDK问题
答案 10 :(得分:0)
你必须在完成的回调中使用CGRectMake(0,0,0,0)做到这一点!
-(void)playMovieAtURL:(NSURL*)theURL
{
MPMoviePlayerController* theMovie=[[MPMoviePlayerController alloc] initWithContentURL:theURL];
theMovie.scalingMode=MPMovieScalingModeAspectFill;
theMovie.view.frame = CGRectMake(2, 246, 317, 70);
[self.view addSubview:theMovie.view];
// Register for the playback finished notification.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(myMovieFinishedCallback:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:theMovie];
// Movie playback is asynchronous, so this method returns immediately.
[theMovie play];
}
// When the movie is done,release the controller.
-(void)myMovieFinishedCallback:(NSNotification*)aNotification
{
MPMoviePlayerController* theMovie=[aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:theMovie];
theMovie.view.frame = CGRectMake(0, 0, 0, 0);
// Release the movie instance created in playMovieAtURL
[theMovie release];
}
答案 11 :(得分:0)
我遇到了类似的问题。播放后会出现一个空屏幕,这会阻止我再次播放视频。 那么这是我的工作。这样播放按钮不会消失。
[self.movieController stop];
[self.movieController prepareToPlay];
[self.movieController pause];
答案 12 :(得分:0)
此外,如果您使用的是http网址,请确保在项目 * .plist 文件中停用App Transport Security。它也会导致黑屏。
添加以下代码:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
<强>这里:强>
[INSERT CODE ABOVE HERE]
</dict>
</plist>
----- BOTTOM OF PLIST FILE