2011-01-25 19 views
5

मैं वर्तमान में एक फोन स्थानीय आइपॉड पुस्तकालय AVPlayer बजाय MPMusicPlayerController का उपयोग कर आवेदन नियंत्रक का उपयोग करने से संगीत खेलने के लिए कोशिश कर रहा हूँ से खेलने के साथ AVMutableAudioMixInputParameters पर काम नहीं कर setVolume।फोन स्थानीय आइपॉड पुस्तकालय

मैं इसे स्थानीय आईपॉड लिब का उपयोग करके और एमपीएमडियाक्वायर से ट्रैक का चयन कर सकता हूं, लेकिन जब मैं AVMutableAudioMixInputParameters का उपयोग करके निम्न स्तर पर ऑडियो शुरू करने का प्रयास करता हूं, तो यह वॉल्यूम को कम नहीं करता है।

कारण मैं एवीप्लेयर का उपयोग कर रहा हूं और MPMusicPlayerController नहीं है कि मैं पृष्ठभूमि में कुछ अन्य ऑडियो चला रहा हूं और MPMusicPlayerController AVPlayer का उपयोग कर मौजूदा ऑडियो फ़ाइल के रूप में खेलने में विफल रहता है हार्डवेयर को हॉगिंग कर रहा है। कोड मैं इस समय है:

// just blindly select all music for now. 
MPMediaQuery *everything = [[MPMediaQuery alloc] init]; 

NSArray *itemsFromGenericQuery = [everything items]; 
MPMediaItem *song; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 

for (song in itemsFromGenericQuery) 
{ 
    [array addObject:song]; 
} 

तो इस बिंदु सरणी में मेरी lib से पटरियों की एक सरणी है।

अब एक हड़पने और का उपयोग कर इसे खेलने के लिए AVPlayer:

// grab the first song off the array 
MPMediaItem *song = [array objectAtIndex:0]; 
NSURL *assetURL = [song valueForProperty:MPMediaItemPropertyAssetURL]; 
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 

NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 
AVAssetTrack *track = [audioTracks objectAtIndex:0]; 

NSMutableArray *allAudioParams = [NSMutableArray array]; 
AVMutableAudioMixInputParameters *audioInputParams = 
     [AVMutableAudioMixInputParameters audioMixInputParameters]; 

// this is the key line - turn the volume down. 
[audioInputParams setVolume:0.3 atTime:kCMTimeZero]; 
[audioInputParams setTrackID:[track trackID]]; 
[allAudioParams addObject:audioInputParams]; 

AVMutableAudioMix *audioZeroMix = [AVMutableAudioMix audioMix]; 
[audioZeroMix setInputParameters:allAudioParams]; 

// Create a player item 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; 

[playerItem setAudioMix:audioZeroMix]; 
[playerItem seekToTime:CMTimeMake(30, 1)]; 

[self setLocalPlayer:[AVPlayer playerWithPlayerItem:playerItem]]; 
[localPlayer play]; 

मैं पुष्टि कर सकता है कि मात्रा AVPlayer का उपयोग करते समय काम करता है का समायोजन एक URL (स्ट्रीमिंग) से फाइल खेलने के लिए; स्थानीय पुस्तकालय से खेलते समय नहीं।

मुझे लगता है मैं किसी भी स्मृति प्रबंधन यहाँ नहीं किया है; बस इसे पहले काम करने की कोशिश कर रहा है। इसके अलावा, स्थानीय खिलाड़ी एक संपत्ति है इसलिए कोई स्पष्ट बरकरार नहीं है।

किसी भी मदद की सराहना की जाएगी!

धन्यवाद।

+0

मैं एक iPhone डेवलपर नहीं कर रहा हूँ, लेकिन प्रतिसाद नहीं उस समारोह का नाम नहीं है ... थोड़ा लंबा? – aviraldg

+0

हे, यह थोड़ा है - लेकिन इसकी एक stdlib lib/समारोह। –

+0

क्या आपने समाधान ढूंढने का प्रबंधन किया था ..? –

उत्तर

0

आप CMTimeMakeWithSeconds (0,1) के साथ kCMTimeZero की जगह की कोशिश की है, या बस 0?

हैं कि अभी भी विफल रहता है,/बाहर प्रभाव में फीका कोशिश करते हैं और 0.

+0

न तो काम :( –

1

AVMutableAudioMix को प्रारंभ समय और समाप्ति समय सेट केवल आधार पर मीडिया, लाइव स्ट्रीमिंग का http नहीं फ़ाइल के लिए उपलब्ध है।

0

ऐसे CMTimeMake(-1, 1) बजाय kCMTimeZero के रूप में एक नकारात्मक समय मूल्य का उपयोग करें।

1

मेरे लिए यह काम (में फीका):

NSString *songName = [NSString stringWithFormat:@"http://xx.xx.xx.xx/%d%@", bitrate, url]; 
playerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:songName]]; 

NSArray *audioTracks = [[playerItem asset] tracks]; 

AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTracks[0]]; 
[audioInputParams setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(0.0, 1.0), CMTimeMakeWithSeconds(3.0, 1.0))]; 

AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
[audioMix setInputParameters:@[audioInputParams]]; 

[playerItem setAudioMix:audioMix]; 

AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 

जब उपयोगकर्ता अगले ट्रैक पर छोड़ सकते हैं या ट्रैक लगभग समाप्त मैं फ़ंक्शन को कॉल करें:

- (void)fadeOut { 
    seconds = CMTimeGetSeconds(playerItem.currentTime); 

    NSArray *audioTracks = [[playerItem asset] tracks]; 

    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTracks[0]]; 
    [audioInputParams setVolumeRampFromStartVolume:1.0 toEndVolume:0.0 timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(seconds, 1.0), CMTimeMakeWithSeconds(3.0, 1.0))]; 

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
    [audioMix setInputParameters:@[audioInputParams]]; 

    [playerItem setAudioMix:audioMix]; 
} 
संबंधित मुद्दे