0

我正在开发一个使用 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];
    }
4

4 回答 4

1

我想到了。在调用第二个视频之前,我需要释放 MediaPlayer。

代码示例:

- (void)onHitButton1 {
    [mMoviePlayer release];
    mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self movieURL]];
    mMoviePlayer.movieControlMode = MPMovieControlModeHidden;
    [mMoviePlayer play];
}
于 2009-06-26T20:23:56.500 回答
1

您还应该注意,播放问题可能只发生在模拟器中,而不是手机上(例如后续播放“闪烁”或不显示图像)。

于 2009-06-27T14:44:54.083 回答
0

你真的要去其他视频吗?

我注意到 3.0 中的一个错误,如果您尝试从同一个文件播放视频两次,您会得到一些奇怪的播放伪影。您上面的代码看起来只有一个指向单个文件的 URL。

我的解决方法是重命名我的文件,但这意味着您必须将其复制到文档目录才能更改名称...也许您可以查看 iPhone 文件系统是否支持符号或硬链接返回资源目录中的原始文件,以便您可以为电影播放器​​提供不同的名称。

我就这个问题提交了 RADAR,你也应该这样做。只需将一个超级简单的示例放在一起,说明什么是行不通的。

于 2009-06-26T19:28:44.333 回答
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];

看起来你写的比你需要的要多。

于 2009-07-26T10:27:00.340 回答