12

運動中に使えるiPhoneアプリを作りました。ベル トーンを再生して、ユーザー (ユーザー) がエクササイズ ルーチンのあるステップから次のステップに切り替える必要があることを示します。アプリを使用しながら iPod の音楽を聴くことができるようにアプリを設計しており、音楽に合わせてトーンが十分に聞こえるようにしたいと考えています。私はこれを機能させました...一種の...

音楽がうるさいと、音が聞こえにくい。私の理想的な解決策は、iPod アプリが着信テキスト メッセージや電子メールを処理する方法に似たものです。音楽の音量が下がり、サウンドが再生された後、音楽の音量がフェード インします。

これまでに試したアプローチは次のとおりです。

  1. AudioServicesPlaySystemSound音を奏でていました。

    次のようにサウンドを初期化しました。

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, CFSTR ("bell"), CFSTR ("wav"), NULL);
    AudioServicesCreateSystemSoundID (soundFileURLRef, &soundFileID);
    

    そして、次を使用して適切なタイミングでサウンドを再生します。

    AudioServicesPlaySystemSound (self.soundFileID);
    

    これは音をうまく再生しますが、大音量の音楽では聞き取りにくすぎます。試行 2...

  2. iPod の音量を下げて、音を鳴らしてから、音量を元のレベルに戻そうとしました。

    現在のステップが 1 秒残っている場合は、音量を下げ始めます。

    if ([self.intervalSet currentStepTimeRemainingInSeconds] == 1) {
        self.volumeIncrement = originalVolume/5.0f;
        [NSTimer scheduledTimerWithTimeInterval:0.5f 
                                         target:self 
                                       selector:@selector(fadeVolumeOut:) 
                                       userInfo:[NSNumber numberWithInt:1]
                                        repeats:NO];
    }
    

    fadeVolumeOut:メソッドは次のとおりです。

    - (void) fadeVolumeOut:(NSTimer *)timer {
        if (!TARGET_IPHONE_SIMULATOR) {
            NSNumber *volumeStep = (NSNumber *)[timer userInfo];
            int vStep = [(NSNumber *)volumeStep intValue];
            float volume = [[MPMusicPlayerController iPodMusicPlayer] volume];
            volume = volume - self.volumeIncrement;
            if (volume < 0.0f) {
                volume = 0.0f;
            }
            [[MPMusicPlayerController iPodMusicPlayer] setVolume:volume];
            if (vStep < 5) {
                vStep = vStep + 1;
                [NSTimer scheduledTimerWithTimeInterval:0.1f 
                                                 target:self 
                                               selector:@selector(fadeVolumeOut:) 
                                               userInfo:[NSNumber numberWithInt:vStep]
                                                repeats:NO];
            }
        }
    }
    

    次に、ステップが終了したら、警告音を再生し、音量をフェード インします。

     [NSTimer scheduledTimerWithTimeInterval:0.1f 
                                      target:self 
                                    selector:@selector(alertAndFadeVolumeIn) 
                                    userInfo:nil
                                     repeats:NO];
    

    alertAndFadeVolumeInメソッドは次のとおりです。

     - (void) alertAndFadeVolumeIn {
         [self alert];
         [NSTimer scheduledTimerWithTimeInterval:0.25f 
                                          target:self 
                                        selector:@selector(fadeVolumeIn:) 
                                        userInfo:[NSNumber numberWithInt:1]
                                         repeats:NO];
     }
    

    そしてfadeVolumeIn:、基本的にfadeVolumeOut:上記の反対です。

    これが機能し、音量がフェードアウトし、サウンドが再生され、音量がフェードインします。問題は、音量が iPod と同じ量だけ低下するため、音楽が聞こえにくくなることです。 .

  3. サウンドを再生するように切り替えAVAudioSession、アプリの使用中に iPod の音楽が引き続き再生されるようにセッションをセットアップしました。セッションを初期化する方法は次のとおりです。

     AVAudioSession *session = [AVAudioSession sharedInstance];
     [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    
     OSStatus propertySetError = 0;
     UInt32 allowMixing = true;
     propertySetError = AudioSessionSetProperty (
         kAudioSessionProperty_OverrideCategoryMixWithOthers,
         sizeof (allowMixing),
         &allowMixing
     );
    
     NSError *activationError = nil;
     [session setActive:YES error:&activationError];
    
     NSString *audioFile = [[NSBundle mainBundle] pathForResource:@"bell"
                                                           ofType:@"wav"];
     player = [[AVAudioPlayer alloc] initWithContentsOfURL:
         [NSURL fileURLWithPath:audioFile] error:NULL];
    

    サウンドを再生するには[self.player play]、適切なタイミングで呼び出します。ここでも、iPod の音量に合わせてトーンの音量が下がり、トーンが聞き取りにくくなります。

  4. [[MPMusicPlayerController applicationMusicPlayer] setVolume:1.0f];アラート音が鳴る直前に入れてみました。これはさまざまな結果をもたらしました。最初は思った通りフルボリュームで音が出ますが、2回目以降は音量がかなり小さくなります。また、音楽がスムーズにフェードアウトしません。同じボリュームを共有してiPodMusicPlayerいるようです。applicationMusicPlayerこれは を使用した結果[AVAudioSession sharedInstance];ですか? を初期化する別の方法はありAVAudioSessionますか?

  5. 次に、AVAudioSession「ダッキング」を使用してみました。

     OSStatus propertySetError = 0;
     UInt32 allowDucking = true;
     propertySetError = AudioSessionSetProperty (
         kAudioSessionProperty_OtherMixableAudioShouldDuck,
         sizeof (allowDucking),
         &allowDucking
     );
    

    残念ながら、オーディオ セッションがアクティブになると、iPod の音楽が「アヒル」になります。

  6. 最後に、ステップが終了する 1 秒前にオーディオ セッションがアクティブになり、ステップが終了するとサウンドが再生され、1 秒後にセッションが非アクティブになるようにコードを変更しました。この時点で、フェード インとフェード アウトのコードをすべて削除しました。関連するコード スニペットは次のとおりです。

    if ([self.intervalSet currentStepTimeRemainingInSeconds] == 1) {
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setActive:YES error:nil];
    }
    

    ...

    if (self.shouldRing) {
        [self.player play]; 
        [NSTimer scheduledTimerWithTimeInterval:1.0f 
                                         target:self 
                                       selector:@selector(stopSound)
                                       userInfo:nil
                                        repeats:NO];
    }
    

    ...

    - (void) stopSound {
        [self.player stop];
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setActive:NO error:nil];
    }
    

    これは、私が本当に立ち往生しているポイントに私を連れて行きます。これは、最初のステップが終了した後に完全に機能します。iPod の音量が小さくなり、サウンドが大きくなり、iPod の音量が 1 秒後にフェードバックします。ただし、ステップが 2 回目に終了すると、サウンドの音量がわずかに小さくなり、3 回目はほとんど聞こえなくなり、4 回目は無音になります。その後、5 回目に再び大きな音が鳴り、このサイクルが繰り返されます。

    その上、アクティブ化と非アクティブ化はかなり重い操作のようで、タイマーがわずかにスタッターします。

誰かが似たようなことをしようとしましたか? iPod の音楽に合わせてサウンドを再生するための好ましい方法はありますか?

4

4 に答える 4

11

最初にやりたいと言ったことを行う正しい方法は、(5) - ダッキングを使用することです。これが取引です。他のアプリがサウンドを再生できるオーディオ セッション タイプを使用します (再生)。サウンドを再生する直前までダッキングをオンにしないでください。サウンドを再生するときは、ダッキングをオンにしてください。バックグラウンド ミュージックがすぐにダッキングされるので、あなたのサウンドが聞こえます。次に、サウンドの再生が終了したら、ダッキングをオフにして (これがトリックです)、オーディオ セッションを非アクティブにしてから再度アクティブにして、バックグラウンド ミュージックを以前のラウドネスにすぐに戻します。

UInt32 duck = 0;
AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(duck), &duck);
AudioSessionSetActive(false);
AudioSessionSetActive(true);

編集: iOS 6 では、Objective-C API だけを使用してすべてのことを実行できます (実行する必要があります)。したがって、他のオーディオのダッキングを開始するには:

[[AVAudioSession sharedInstance] 
    setCategory: AVAudioSessionCategoryAmbient
    withOptions: AVAudioSessionCategoryOptionDuckOthers
          error: nil];

サウンドの再生が終了したら、ダッキングをオフにします。

[[AVAudioSession sharedInstance] setActive:NO withOptions:0 error:nil];
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient
                                 withOptions: 0
                                       error: nil];
[[AVAudioSession sharedInstance] setActive:YES withOptions: 0 error:nil];
于 2011-01-09T19:04:19.560 に答える
11

AVAudioSessionは、「アプリケーション、アプリケーション間、およびデバイス レベルでのオーディオ動作」を処理する適切な方法です。iOS 4 で少し変更した #6 を使用しましたが、問題はありませんでした。バックグラウンド オーディオがフェードアウトし、私のサウンドが再生され、バックグラウンド オーディオがフェードインしました。

  1. オーディオ セッションの初期化 (エラー処理コードを削除):

    AVAudioSession* audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]
    [audioSession setActive:NO error:nil];
    
  2. サウンドの再生 (AVAudioPlayerの play/prepareToPlay はオーディオ セッションをアクティブにします):

    AVAudioPlayer* audioPlayer = [[[AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:nil];
    [audioPlayer play];
    
  3. 音を止める:

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

    フラグkAudioSessionSetActiveFlag_NotifyOthersOnDeactivation (iOS 4 の新機能) は、バックグラウンド オーディオに通知して再生を再開するようにシステムに指示します。

于 2010-06-24T15:41:44.390 に答える
4

なぜ#2に戻らないのですか?それ以外の:

  1. フェードアウト
  2. プレイアラート
  3. フェードイン

使用する:

  1. フェードアウト
  2. 音楽を一時停止
  3. 音量を上げる
  4. プレイアラート
  5. 音量を下げる
  6. 音楽を再生
  7. フェードイン
于 2010-01-17T08:27:27.240 に答える