MPAudioPlayerController

MPAudioPlayerController

我有一个应用程序,它使用MPAudioPlayerController访问iPod音乐库,并使用AVAudioPlayer在音乐之上叠加音频。我已经使用this documentation作为指导。具体来说:



但是我没有看到这种行为。实际上,我看到(或听到的)是,如果我将kSessionSessionProperty_OtherMixableAudioShouldDuck设置为true时设置了AudioSession,则MPAudioPlayerController的初始音量会减小,并且如果我随后在MPAudioPlayerController上调用暂停(然后再次播放),则音量级别增加到“正常”水平。播放AVAudioPlayer对音频电平没有任何影响...

因此,我建立了一个简单的测试用例来重现这一点。

在ViewController header 中:

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>

@interface MusicPlayerVolumeTestViewController : UIViewController <AVAudioPlayerDelegate>
{
    UIButton *musicButton;
    UIButton *soundButton;
    AVAudioPlayer *audioPlayer;
    MPMusicPlayerController *musicPlayerController;
}
@property (nonatomic, retain) IBOutlet UIButton *musicButton;
@property (nonatomic, retain) IBOutlet UIButton *soundButton;
@property (nonatomic, retain) MPMusicPlayerController *musicPlayerController;

- (IBAction)musicAction;
- (IBAction)soundAction;

@end

并在实现中:
- (void)viewDidLoad
{
    [super viewDidLoad];

    //Setup our Audio Session
    OSStatus status = AudioSessionInitialize(NULL, NULL, NULL, NULL);
    //We want our audio to play if the screen is locked or the mute switch is on
    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
    status = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
    //We want our audio to mix with other app's audio
    UInt32 shouldMix = true;
    status = AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (shouldMix), &shouldMix);
    //Enable "ducking" of the iPod volume level while our sounds are playing
    UInt32 shouldDuck = true;
    AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(shouldDuck), &shouldDuck);
    //Activate our audio session
    AudioSessionSetActive(YES);

    //Setup the Music Player to access the iPod music library
    self.musicPlayerController = [MPMusicPlayerController applicationMusicPlayer];
    [self.musicPlayerController setShuffleMode: MPMusicShuffleModeSongs];
    [self.musicPlayerController setRepeatMode: MPMusicRepeatModeNone];
    [self.musicPlayerController setQueueWithQuery:[MPMediaQuery songsQuery]];

    //Setup a AVAudioPlayer sound to overlay against the Music Player audio
    NSURL *soundURL = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"overlay" ofType:@"mp3"]];
    NSError *error = nil;
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error: &error];
    if (!audioPlayer)
    {
        NSLog(@"Could not create audio effect player: %@", [error localizedDescription]);
    }
    [audioPlayer prepareToPlay];
}

- (IBAction)musicAction
{
    if (self.musicPlayerController.playbackState == MPMusicPlaybackStatePlaying)
    {
        [self.musicPlayerController pause];
    }
    else if (self.musicPlayerController.playbackState == MPMusicPlaybackStateStopped
          || self.musicPlayerController.playbackState == MPMusicPlaybackStatePaused)
    {
        [self.musicPlayerController play];
    }
}

- (IBAction)soundAction
{
    if (audioPlayer.playing)
    {
        [audioPlayer pause];
    }
    else
    {
        [audioPlayer play];
    }
}

我已经连接了几个UIButtons。一个用于musicAction(用于播放/暂停MPMusicPlayerController),另一个用于soundAction(用于播放/暂停AVAudioPlayer)。

如前所述,如果我点击musicAction按钮,则会播放音乐,但音量会降低;如果我点击soundAction按钮,则会播放叠加层,但不会影响MPMusicPlayerController的音量。而且,更像bug的是,当我暂停然后播放MPMusicPlayerController时,音乐的音量会增加到我未设置AudioSession时的水平。

我很想知道是否还有其他人有过这种经历,如果是这样的话,如果您找到了解决方法(或者可以告诉我我做错了什么)。否则,我想我要去雷达了。

非常感谢,

列维

最佳答案

当我遇到类似的问题并且无法使其始终如一地工作时,我使用了这篇文章。它会工作一会儿,然后“卡住”。我花了很多时间进行研究和调试,最后才叫苹果。他们告诉我看看面包屑示例代码。我按照那个例子进行,一切正常。

这是苹果公司的示例代码:

http://developer.apple.com/library/ios/#samplecode/Breadcrumb/Introduction/Intro.html

苹果公司的支持/开发人员还说,要注意设置 session 属性的方式和时间的顺序。那显然是诀窍。在这里和其他地方阅读了很多文章之后,我的设置相互冲突。从头开始,并遵循面包屑的示例,使之可行。从那以后我再也没有问题了。

我在这里发布了相同的答案:

How to unduck AVAudioSession

对我来说,这个答案是边缘性的商业 secret ,因为它很难上手并且市场上有可用的应用程序。对我来说,看到一个有效的例子,这仅仅是声音的回避和吸引人的值(value)。

另外,我向苹果公司提到这是一个已知问题,他们不同意。他们不知道这里有什么问题。如果您遵循面包屑示例,那么可以肯定的是,它可以在不进行任何奇怪的 session 停用和响应等的情况下工作。

10-08 02:31