2010-07-20 21 views
8

我有一個應用程序,它使用MPAudioPlayerController來訪問iPod音樂庫,以及一個AVAudioPlayer來覆蓋音樂上的音頻。我用this documentation作爲指導。具體來說:在iOS 4中破壞的音頻會話「Ducking」...?

最後,您可以增強一個類別,以在播放音頻時自動降低其他音頻的音量。例如,這可以在練習應用程序中使用。假設用戶在應用程序要覆蓋口頭消息時正在鍛鍊iPod,例如「您已經划船10分鐘」。要確保應用程序的消息可以理解,請將kAudioSessionProperty_OtherMixableAudioShouldDuck屬性應用於音頻會話。當發生低音時,設備上的所有其他音頻(除了手機音頻)都會降低音量。

但我沒有看到這種行爲。實際上,我所看到的(或聽到的)是,如果我將kAudioSessionProperty_OtherMixableAudioShouldDuck設置爲true,MPAudioPlayerController初始音量減少,如果我在MPAudioPlayerController上調用暫停(然後再次播放),音量級別得到增加到「正常」的水平。播放AVAudioPlayer對音頻電平沒有任何影響...

所以我設置了一個簡單的測試用例來重現此問題。

在視圖控制器頭:

#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的音量。而且,更像錯誤的是,當我暫停並播放MPMusicPlayerController時,音樂音量增加到如果我沒有設置AudioSession時的音量。

我很想知道是否有其他人有過這樣的經歷,如果有的話,如果你找到了解決辦法(或者可以告訴我,我做錯了什麼)。否則,我想我已經去過雷達了。

非常感謝,

列維

回答

2

該文檔是不清楚什麼迴避的預期行爲應該是,但我發現的是,如果您設置的音頻會話當你激活音頻會話時,它會消失,當你停用時,它會消失。因此,您必須保持激活和停用音頻會話才能爲您的聲音提示播放音樂。

我發現的一個錯誤是,如果在AVAudioPlayerDelegateaudioPlayerDidFinishPlaying:successfully:方法中禁用音頻會話,則不會刪除迴避,並且音量保持在同一水平。我已經在此提交了一個雷達,但如果其他類似的文件不會受到傷害。事實上,它可能會給他們施加一些壓力來修復它。

你正在做的是開始音頻會話並保持開啓狀態,因此它會立即鴨子並保持低音,以便在播放聲音時不會進一步淹沒音樂。暫停播放音樂後音樂音量恢復正常的問題聽起來像是一個錯誤。

3

在任何情況下,鴨子都不會自動與您的播放聲音相關。當你開啓迴避功能時,背景聲音會變成鴨子。當您關閉迴避和停用音頻會話時,背景音會恢復到原始級別。

所以不要打開你的viewDidLoad。不要打開它,直到你真的要播放聲音。這會導致背景音。當您的聲音播放完畢後,請將其關閉並將您的音頻會話切換爲不活動狀態並再次激活。這導致背景聲音unduck:

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

我用這個帖子,當我有一個類似的問題,並難以得到它一致工作。它會工作一段時間,然後就被卡住了。我花了很多時間研究和調試,最後纔打電話給Apple。他們讓我看看麪包屑示例代碼。我遵循這個例子,一切正常。

這裏是蘋果公司的示例代碼:蘋果

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

支持/開發商也表示,看他們如何和何時設置會話屬性的順序。這顯然是訣竅。在閱讀了很多這裏和其他地方的帖子後,我的設置互相沖突。從頭開始,並遵循麪包屑示例使其工作。自那之後我就沒有問題了。

我在這裏公佈了相同的答案:

How to unduck AVAudioSession

對我來說這答案是邊緣的商業祕密,因爲它是如此難以得到工作,有在市場上工作的應用程序。對於我來說,看到一個可行的例子,這幾乎就是聲音的低音和無聲的音樂,它的價值體現在黃金上。

此外,我提到蘋果公司,這是一個已知問題,他們不同意。他們在這裏沒有意識到任何問題。果然,如果你遵循麪包屑的例子,它適用於任何奇怪的會議停用和反應等,等等。