1

私の問題について詳細に説明しようと思います。

アプリのサウンドを使用するストアにあるアプリがあります。現在、一部のサウンドが重なり合って順番に再生できるようになるため、AVQueuePlayer を使用しています。AVPlayer を使用して埋め込みビデオを再生しているときに、このサウンドの多くが再生されますが、これはまったく問題にならない可能性があります。問題は、アプリ全体で音が止まるという報告があることです。これを自分で再現することはできませんが、多くのアクティブ ユーザーがおり、何人かから報告されています。それが報告され、サイレント スイッチや音量ダウンだけではないと判断した場合はいつでも、アプリを再起動すると常に問題が解決します。時折、サウンドが魔法のように変化せずに戻ってくるという話を耳にします。また、airplay と bluetooth を使用しているときに発生するという報告もいくつかありましたが、これは単に問題の複雑化または偶然の一致である可能性があります。

以下は私が使用しているコードです。設定が間違っているか、使用すべき設定を使用していない可能性がありますが、このコードは 99.9% の確率で機能します。

ユーザーの iPod ミュージックの音量を下げるために、再生するすべてのサウンドにダッキングを使用しています。

appDidFinishLaunchingWithOptions での初期化は次のとおりです (最初はまったく必要なく、規則が混在していて申し訳ありません)。

AudioSessionInitialize (NULL, NULL, NULL, NULL);

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

    UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;
    AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);

    [[AVAudioSession sharedInstance] setActive:YES withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];

サウンドを再生すると:

-(void)playSound: (NSString *)soundString
{
    OSStatus propertySetError = 0;
    UInt32 allowMixing = true;
    propertySetError |= AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(allowMixing), &allowMixing);

    [[AVAudioSession sharedInstance] setActive:YES withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];

    NSURL *thisUrl = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@.caf", [[NSBundle mainBundle] resourcePath], soundString]];

    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:thisUrl];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reachedEndOfItem:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:item];

    if(_audioPlayerQueue == nil)
    {
        _audioPlayerQueue = [[AVQueuePlayer alloc] initWithItems:[NSArray arrayWithObject:item]];
    }
    else
    {
        if([_audioPlayerQueue canInsertItem:item afterItem:nil])
        {
            [_audioPlayerQueue insertItem:item afterItem:nil];
        }
    }

    if(_audioPlayerQueue == nil)
    {
        NSLog(@"error");
    }
    else
    {
        [_audioPlayerQueue play];
    }

    return;
}

サウンドの再生が終了したら:

- (void)reachedEndOfItem: (AVPlayerItem*)item
{
    [self performSelector:@selector(turnOffDucking) withObject:nil afterDelay:0.5f];
}

- (void)turnOffDucking
{
    NSLog(@"reached end");

    [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];

    OSStatus propertySetError = 0;
    UInt32 allowMixing = false;
    propertySetError |= AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(allowMixing), &allowMixing);
}

私が間違っていること、オーディオセッションに使用すべき設定、または既知のバグ/問題についての洞察は非常に役立ちます. ビデオを再生し、iPod の音楽を並行して再生すると、パフォーマンスにわずかな問題が発生する可能性があるため、別のオーディオ エンジンの使用を検討したいと思いますが、このオーディオ再生方法に固執したいと思います。

ご協力いただきありがとうございます。

-ライアン

4

1 に答える 1