2010-05-03 15 views
8

मैं MPMusicPlayerController (यानी, आइपॉड लाइब्रेरी से खेलना) से आने वाले ऑडियो का नियंत्रण लेना चाहता हूं। उदाहरण के लिए, मैं इस पर ईक्यू लागू करना चाहता हूं या डीएसपी, रीवरब, उस तरह की चीज करना चाहता हूं।क्या मैं MPMusicPlayerController से प्लेबैक के लिए ऑडियो सत्र/ऑडियो इकाइयों को लागू कर सकता हूं?

क्या यह संभव है? क्या कोई ऑडियो सत्र है जिसे मैं एक हैंडल पकड़ सकता हूं? या, शायद AVAudioPlayer का उपयोग कर आईपॉड लाइब्रेरी से फ़ाइलों को वापस चलाने का कोई तरीका है?

उत्तर

6

MPMusicPLayerController "अच्छी तरह से" ए वी फ्रेमवर्क साथ काम नहीं करता मैं कुछ डीएसपी MPMusicPlayerController का उपयोग करते हुए मीडिया आइटम तो उस आइटम के लिए यूआरएल पाने के लिए पाने में कामयाब रहे। फिर AVURLASSet और AVAssetReader का उपयोग करें। कुछ इस तरह:

MPMediaItem *currentSong = [myMusicController nowPlayingItem]; 
NSURL *currentSongURL = [currentSong valueForProperty:MPMediaItemPropertyAssetURL]; 
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:currentSongURL options:nil]; 
NSError *error = nil;   
AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:songAsset error:&error]; 

AVAssetTrack* track = [[songAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 

NSMutableDictionary* audioReadSettings = [NSMutableDictionary dictionary]; 
[audioReadSettings setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] 
        forKey:AVFormatIDKey]; 

AVAssetReaderTrackOutput* readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:audioReadSettings]; 
[reader addOutput:readerOutput]; 
[reader startReading]; 
CMSampleBufferRef sample = [readerOutput copyNextSampleBuffer]; 
while(sample != NULL) 
{ 
    sample = [readerOutput copyNextSampleBuffer]; 

    if(sample == NULL) 
     continue; 

    CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sample); 
    CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(sample); 

    AudioBufferList audioBufferList; 

    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sample, 
                  NULL, 
                  &audioBufferList, 
                  sizeof(audioBufferList), 
                  NULL, 
                  NULL, 
                  kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, 
                  &buffer 
                  ); 

    for (int bufferCount=0; bufferCount < audioBufferList.mNumberBuffers; bufferCount++) { 
     SInt16* samples = (SInt16 *)audioBufferList.mBuffers[bufferCount].mData; 
     for (int i=0; i < numSamplesInBuffer; i++) { 
      NSLog(@"%i", samples[i]); 
     } 
    } 

    //Release the buffer when done with the samples 
    //(retained by CMSampleBufferGetAudioBufferListWithRetainedblockBuffer) 
    CFRelease(buffer);    

    CFRelease(sample); 
+0

तो AVURLAsset का उपयोग करके आप सीधे फ़ाइल तक पहुंच सकते थे या क्या? –

+0

हां, आपको ध्वनि डेटा तक पूर्ण पहुंच मिलती है। मैं वास्तविक डेटा देखने के लिए शेष कोड के लिए उत्तर संपादित कर दूंगा। – ugiflezet

+1

कमाल! धन्यवाद –

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