iPhone Dev:MediaPlayer在后续播放时不播放视频(仅音频)

时间:2009-06-26 16:39:25

标签: iphone multimedia

我正在开发一个使用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 个答案:

答案 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];

看起来你的写作方式超出了你的需要。

相关问题