0

AVFoundationフレームワークとAVPlayerItemを使用して、iPhoneゲームでバックグラウンドソングを再生し、効果音も付けようとしています。AVPlayerItem と AVPlayer のヘルプを求めてインターネットを探しましたが、AVAudioPlayer に関する情報しか見つかりません。

バックグラウンド ソングは正常に再生されますが、キャラクターがジャンプするときに 2 つの問題があります。

1) 最初のジャンプ (ジャンプ メソッド内の [プレーヤー再生]) で、ジャンプ効果音が BGM を中断します。

2) もう一度ジャンプしようとすると、「AVPlayerItem を 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.");
}

この行を 2 番目のメソッドから最初のメソッドに移動すると:

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

ゲームはクラッシュせず、バックグラウンド ソングは完全に再生されますが、コンソールに「サウンドを再生中」と表示されていても、ジャンプ効果音は再生されません。ジャンプごとに。

ありがとうございました

4

1 に答える 1

0

私はそれを考え出した。

エラー メッセージは、私が知る必要があるすべてのことを教えてくれました: AVPlayerItem ごとに複数の AVPlayer を持つことはできません。これは、私が教えられたことに反しています。

とにかく、AVPlayerItems を soundDictionary に格納する代わりに、soundName を各アセットのキーとして、AVURLAssets を soundDictionary に格納しました。次に、サウンドを再生するたびに、新しい AVPlayerItemとAVPlayer を作成しました。

もう1つの問題はARCでした。異なるアイテムごとに AVPlayerItem を追跡できなかったので、AVPlayerItem と AVPlayer を格納する NSMutableArray を作成する必要がありました。

固定コードは次のとおりです。

- (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 に答える