0

我正在尝试使用 AVFoundation 框架和 AVPlayerItem 在我的 iPhone 游戏中播放背景歌曲并且还具有音效。我已经在互联网上搜索了有关 AVPlayerItem 和 AVPlayer 的帮助,但我只找到有关 AVAudioPlayer 的内容。

背景歌曲播放正常,但是当角色跳跃时,我有2个问题:

1) 初始跳跃时([player play] inside jump方法),跳跃音效打断背景音乐。

2)如果我再次尝试跳转,游戏会崩溃并出现错误“AVPlayerItem cannot be associated with more than one instance of AVPlayer”

我的教授告诉我为我想播放的每个声音创建一个新的 AVPlayer 实例,所以我很困惑。

我正在做数据驱动设计,所以我的声音文件列在 .txt 中,然后加载到 NSDictionary 中。

这是我的代码:

- (void) storeSoundNamed:(NSString *) soundName 
        withFileName:(NSString *) soundFileName
{
    NSURL *assetURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:soundName ofType:soundFileName]];

    AVURLAsset *mAsset = [[AVURLAsset alloc] initWithURL:assetURL options:nil];

    AVPlayerItem *mPlayerItem = [AVPlayerItem playerItemWithAsset:mAsset];

    [soundDictionary setObject:mPlayerItem forKey:soundName];

    NSLog(@"Sound added.");
}

- (void) playSound:(NSString *) soundName
{
    // from .h: @property AVPlayer *mPlayer;
    // from .m: @synthesize mPlayer = _mPlayer;       

    _mPlayer = [[AVPlayer alloc] initWithPlayerItem:[soundDictionary valueForKey:soundName]];

    [_mPlayer play];
    NSLog(@"Playing sound.");
}

如果我将此行从第二种方法移到第一种方法中:

_mPlayer = [[AVPlayer alloc] initWithPlayerItem:[soundDictionary valueForKey:soundName]];

游戏不崩溃,背景歌曲播放完美,但不播放跳跃音效,即使控制台显示“正在播放声音”。每次跳跃。

谢谢

4

1 回答 1

0

我想到了。

错误消息告诉我我需要知道的一切:每个 AVPlayerItem 不能有多个 AVPlayer,这与我所学的相反。

无论如何,我没有将我的 AVPlayerItems 存储在 soundDictionary 中,而是将 AVURLAssets 存储在 soundDictionary 中,其中 soundName 作为每个 Asset 的键。然后我每次想播放声音时都创建了一个新的 AVPlayerItem和AVPlayer。

另一个问题是ARC。我无法跟踪每个不同项目的 AVPlayerItem,所以我必须制作一个 NSMutableArray 来存储 AVPlayerItem 和 AVPlayer。

这是固定代码:

- (void) storeSoundNamed:(NSString *) soundName 
        withFileName:(NSString *) soundFileName
{
    NSURL *assetURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:soundName ofType:soundFileName]];

    AVURLAsset *mAsset = [[AVURLAsset alloc] initWithURL:assetURL options:nil];

    [_soundDictionary setObject:mAsset forKey:soundName];

    NSLog(@"Sound added.");
}

- (void) playSound:(NSString *) soundName
{
    // beforehand: @synthesize soundArray;
    // in init: self.soundArray = [[NSMutableArray alloc] init];

    AVPlayerItem *mPlayerItem = [AVPlayerItem playerItemWithAsset:[_soundDictionary valueForKey:soundName]];

    [self.soundArray addObject:mPlayerItem];

    AVPlayer *tempPlayer = [[AVPlayer alloc] initWithPlayerItem:mPlayerItem];

    [self.soundArray addObject:tempPlayer];

    [tempPlayer play];

    NSLog(@"Playing Sound.");
} 
于 2012-06-04T23:07:01.693 回答