2010-07-20 10 views
8

मेरे पास एक ऐप है जो आईपॉड संगीत लाइब्रेरी तक पहुंचने के लिए MPAudioPlayerController का उपयोग करता है, और एक AVAudioPlayer संगीत के शीर्ष पर ऑडियो ओवरले करने के लिए करता है। मैंने एक गाइड के रूप में this documentation का उपयोग किया है। विशेष रूप से:ऑडियो सत्र "डकिंग" आईओएस 4 में टूटा हुआ ...?

अंत में, जब आप अपना ऑडियो चला रहे हों तो आप स्वचालित रूप से अन्य ऑडियो की मात्रा को कम करने के लिए एक श्रेणी को बढ़ा सकते हैं। इसका उपयोग व्यायाम अभ्यास में उदाहरण के लिए किया जा सकता है। मान लें कि उपयोगकर्ता अपने आईपॉड के साथ व्यायाम कर रहा है जब आपका एप्लिकेशन एक मौखिक संदेश ओवरले करना चाहता है-उदाहरण के लिए, "आप 10 मिनट के लिए रोइंग कर रहे हैं।" यह सुनिश्चित करने के लिए कि आपके एप्लिकेशन का संदेश समझदार है, kAudioSessionProperty_OtherMixableAudioShouldDuck प्रॉपर्टी को लागू करें ऑडियो सत्र जब डकिंग होती है, डिवाइस पर अन्य सभी ऑडियो-वॉल्यूम में फोन ऑडियो-लोअर के अलावा।

लेकिन मुझे यह व्यवहार नहीं दिख रहा है। असल में, जो मैं देखता हूं (या सुनता हूं) यह है कि अगर मैं ऑडियोऑशन को KAudioSessionProperty_OtherMixableAudioShouldDuck के साथ सेट करता हूं, तो MPAudioPlayerController प्रारंभिक वॉल्यूम कम हो जाता है, और यदि मैं MPAudioPlayerController पर वॉल्यूम स्तर पर रोक (और फिर फिर से खेलता हूं) "सामान्य" स्तर तक बढ़ जाता है। AVAudioPlayer को बजाना ऑडियो स्तर पर कोई प्रभाव नहीं पड़ता है ...

इसलिए मैंने इसे पुन: पेश करने के लिए एक सरल परीक्षण केस स्थापित किया है।

एक ViewController हेडर में:

#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 ऊपर तार कर दिया है। संगीत के लिए एक (MPMusicPlayerController को चलाने/रोकने के लिए उपयोग किया जाता है) और एक ध्वनि के लिए (AVAudioPlayer को चलाने/रोकने के लिए उपयोग किया जाता है)।

जैसा कि बताया गया है, अगर मैं संगीत एक्शन बटन टैप करता हूं, तो संगीत बजाता है, लेकिन कम मात्रा स्तर पर, और यदि मैं ध्वनि क्रिया बटन टैप करता हूं, ओवरले नाटकों, लेकिन MPMusicPlayerController की मात्रा पर कोई प्रभाव नहीं पड़ता है। और, अधिक बग-जैसी, यह है कि जब मैं रोकता हूं और MPMusicPlayerController चलाता हूं तो संगीत की मात्रा स्तर तक बढ़ जाती है, अगर मैंने ऑडियो सत्र स्थापित नहीं किया होता।

मुझे यह जानने में दिलचस्पी है कि किसी और के पास यह अनुभव है, और यदि ऐसा है तो आपको आसपास कोई काम मिल गया है (या मुझे बता सकता है कि मैं कुछ गलत कर रहा हूं)। अन्यथा, मुझे लगता है कि मैं रडार से बाहर हूं।

बहुत धन्यवाद,

लेवी

उत्तर

2

प्रलेखन क्या पूर्ण रूप से भीगना की अपेक्षित व्यवहार माना जाता है के बारे में स्पष्ट नहीं है, लेकिन मैं क्या पाया है कि यदि आप के लिए आपके ऑडियो सत्र सेट है डकिंग, जब आप ऑडियो सत्र को सक्रिय करते हैं, तो यह बतख होता है, और जब आप इसे निष्क्रिय करते हैं, तो यह बेकार हो जाता है। इसलिए आपको अपने ध्वनि क्यू के लिए संगीत को बताने के लिए ऑडियो सत्र को सक्रिय और निष्क्रिय करना होगा।

मुझे मिली एक बग यह है कि अगर आप अपने 10 की audioPlayerDidFinishPlaying:successfully: विधि के अंदर ऑडियो सत्र को निष्क्रिय करते हैं, तो डकिंग को हटाया नहीं जाता है, और वॉल्यूम एक ही स्तर पर रखा जाता है। मैंने पहले ही इस पर एक रडार दायर किया है, लेकिन अगर अन्य फाइल समान हैं तो इससे कोई दिक्कत नहीं होती है। असल में यह शायद इसे ठीक करने के लिए कुछ दबाव डालेगा।

आप जो कर रहे हैं वह ऑडियो सत्र शुरू कर रहा है और इसे चालू रख रहा है, इसलिए यह तुरंत बतख जाता है और डक जाता रहता है, ताकि जब आप ध्वनि बजाते हों तो संगीत को आगे नहीं छोड़ेगा। संगीत को रोकने और बजाने के बाद संगीत की मात्रा के साथ समस्या एक बग की तरह लगता है।

3

डकिंग किसी भी तरह से आपकी बजती आवाज़ से स्वचालित रूप से संबंधित नहीं है। जब आप डकिंग, पृष्ठभूमि ध्वनि बतख चालू करते हैं। जब आप अपने ऑडियो सत्र को डकिंग और निष्क्रिय कर देते हैं, तो पृष्ठभूमि ध्वनि अपने मूल स्तर पर वापस आती है।

तो viewDidLoad में डंकिंग चालू करें। जब तक आप वास्तव में ध्वनि चलाने के बारे में नहीं हैं तब तक इसे चालू न करें। इससे बैकग्राउंड ध्वनि बतख हो जाती है। जब आपकी आवाज बजती है, तो पीछे हटना बंद करें और अपने ऑडियो सत्र को निष्क्रिय और फिर से सक्रिय करें। इससे पृष्ठभूमि की आवाज कम हो जाती है:

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

मैंने इस पोस्ट का उपयोग किया जब मुझे एक समान समस्या थी और इसे लगातार काम करने में परेशानी थी। यह थोड़ी देर के लिए काम करेगा और फिर बस "ducked" अटक जाओ। मैंने शोध करने और इसे डिबग करने में बहुत समय बिताया और आखिरकार ऐप्पल को बुलाया। उन्होंने मुझे ब्रेडक्रंब नमूना कोड देखने के लिए कहा। मैंने उस उदाहरण का पालन किया और सब कुछ ठीक काम किया। एप्पल पर

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

समर्थन/डेवलपर भी कैसे और कब वे सत्र गुण सेट के आदेश को देखने के लिए कहा:

यहाँ एप्पल के नमूना कोड है। वह स्पष्ट रूप से चाल थी। यहां और अन्य जगहों पर बहुत सी पोस्ट पढ़ने के बाद, मेरे पास एक-दूसरे के साथ विवादित सेटिंग्स थीं। खरोंच से शुरू करना और रोटी के टुकड़े के उदाहरण के बाद यह काम करता है। मुझे तब से कोई समस्या नहीं है।

मैं यहाँ एक ही उत्तर पोस्ट:

How to unduck AVAudioSession

मेरे लिए इस उत्तर सीमा व्यापार रहस्य था, क्योंकि यह इतना काम कर पाने के लिए मुश्किल था और वहाँ बाजार में काम कर रहे क्षुधा थे। मेरे लिए, एक कामकाजी उदाहरण देखकर, जो कि बहुत अच्छा था, ध्वनि चूसने और अंडकिंग सोने में अपना वजन लायक था।

इसके अलावा, मैंने ऐप्पल का उल्लेख किया कि यह एक ज्ञात मुद्दा था और वे सहमत नहीं थे। वे यहां किसी भी मुद्दे से अवगत नहीं थे। निश्चित रूप से पर्याप्त है कि यदि आप ब्रेडक्रंब उदाहरण का पालन करते हैं तो यह किसी भी अजीब सत्र को निष्क्रिय और प्रतिक्रियाशील इत्यादि के साथ काम करता है, आदि

संबंधित मुद्दे