मेरे पास एक ऐप है जो आईपॉड संगीत लाइब्रेरी तक पहुंचने के लिए 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 चलाता हूं तो संगीत की मात्रा स्तर तक बढ़ जाती है, अगर मैंने ऑडियो सत्र स्थापित नहीं किया होता।
मुझे यह जानने में दिलचस्पी है कि किसी और के पास यह अनुभव है, और यदि ऐसा है तो आपको आसपास कोई काम मिल गया है (या मुझे बता सकता है कि मैं कुछ गलत कर रहा हूं)। अन्यथा, मुझे लगता है कि मैं रडार से बाहर हूं।
बहुत धन्यवाद,
लेवी