我正在开发一个使用MediaPlayer播放几个不同视频的iPhone应用程序。它适用于第一个视频,但当我尝试播放另一个视频时,屏幕保持黑色,只播放音频。有谁知道为什么会发生这种情况?
这是我的代码:
-(NSURL *)movieURL
{
NSBundle *bundle = [NSBundle mainBundle];
if (bundle)
{
NSString *moviePath = [bundle pathForResource:vidName ofType:@"mov"];
if (moviePath)
mMovieURL = [NSURL fileURLWithPath:moviePath];
if (vidName == @"Vid01")
vidName = @"Vid02";
else if (vidName == @"Vid02")
vidName = @"Vid03";
}
return mMovieURL;
}
- (void)onHitButton1 {
mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self movieURL]];
mMoviePlayer.movieControlMode = MPMovieControlModeHidden;
[mMoviePlayer play];
}
答案 0 :(得分:1)
我明白了。我需要在调用第二个视频之前释放MediaPlayer。
代码示例:
- (void)onHitButton1 {
[mMoviePlayer release];
mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self movieURL]];
mMoviePlayer.movieControlMode = MPMovieControlModeHidden;
[mMoviePlayer play];
}
答案 1 :(得分:1)
您还应注意,播放问题可能只发生在模拟器中,而不是手机上(例如后续播放'闪烁'或不显示图像)。
答案 2 :(得分:0)
你真的要去看其他视频吗?
我注意到3.0中的一个错误,如果你尝试从同一个文件播放两次视频,你会得到一些奇怪的播放工件。上面的代码看起来只有一个指向单个文件的URL。
我的解决方法是重命名我的文件,但这意味着您必须将其复制到文档目录才能更改名称...也许您可以看到iPhone文件系统是否支持符号或硬链接返回资源目录中的原始文件,以便为电影播放器提供不同的名称。
我在这个问题上提交了一个RADAR,你也应该这样做。只是把一个非常简单的例子放在一起,显示什么不起作用。
答案 3 :(得分:0)
不应该在资源路径之前而不是之后更改vidname吗?
无论哪种方式,最好将其编写为接受可以传递文件名的NSString。你知道吗
-(NSURL *)movieURLForVideo: (NSString) videoFileName
? 我也不喜欢你缺乏{}的。这使我更容易阅读/调试。一般来说这是一个好习惯。花费额外的时间尽可能整洁地写东西会让你头疼。
-(NSURL *)movieURL
{
NSBundle *bundle = [NSBundle mainBundle];
if (bundle)
{
if (vidName == @"Vid01")
{
vidName = @"Vid02";
}
else if (vidName == @"Vid02")
{
vidName = @"Vid03";
}
else if (vidName == @"Vid03")
{
vidName = @"Vid01";
}
NSString *moviePath = [bundle pathForResource:vidName ofType:@"mov"];
if (moviePath)
{
mMovieURL = [NSURL fileURLWithPath:moviePath];
}
}
return mMovieURL;
}
vidName是否在某处设置为Vid01?我没有看到它,所以我不得不问。这一般只是令人困惑。我一直在为OS X写作,所以我不确定是否有任何差异,但是当我在当前项目中加载地图时我会使用它:
NSString* mapPath = [[NSBundle mainBundle] pathForResource:mapFileName ofType:mapFileType];
NSURL* mapURL = [NSURL fileURLWithPath: mapPath];
currentMap_ = [[Map alloc] initWithContentsOfURL: mapURL];
看起来你的写作方式超出了你的需要。