2011-01-14 13 views
10

में HTTP लाइव स्ट्रीमिंग का उपयोग करके मेटाडेटा पढ़ना संभव है HTTP लाइव स्ट्रीमिंग विधि का उपयोग करके लाइव स्ट्रीम चलाते समय, क्या यह संभव मेटाडेटा (उदाहरण के लिए शीर्षक और कलाकार) को पढ़ सकता है? यह एक आईफोन रेडियो ऐप के लिए है।क्या आईफ़ोन एसडीके

उत्तर

0

यह है, लेकिन यह आसान नहीं है। ऑडियो स्ट्रीमिंग के बारे में मैट गैलाघर के पास nice post on his blog है। विषय पर उन्हें उद्धृत करने के लिए:

मेटाडेटा का सबसे आसान स्रोत HTTP शीर्षलेख से आता है। eventType: handleReadFromStream अंदर विधि, CFReadStreamCopyProperty का उपयोग CFReadStreamRef से kCFStreamPropertyHTTPResponseHeader संपत्ति को कॉपी, तो आप CFHTTPMessageCopyAllHeaderFields उपयोग कर सकते हैं प्रतिक्रिया से बाहर शीर्ष लेख फ़ील्ड कॉपी करने के लिए। कई स्ट्रीमिंग ऑडियो सर्वरों के लिए, स्ट्रीम नाम इन फ़ील्ड में से एक है।

मेटाडाटा का काफी कठिन स्रोत ID3 टैग हैं। ID3v1 फ़ाइल के अंत में हमेशा है (इसलिए स्ट्रीमिंग के दौरान बेकार है)। ID3v2 शुरुआत में स्थित है, इसलिए पहुंच योग्य हो सकता है।

मैंने कभी नहीं ID3 टैग पढ़ा लेकिन मुझे लगता है है कि यदि आप पहले कुछ सौ फ़ाइल कहीं के रूप में यह लोड करता है की किलोबाइट कैश, AudioFileGetProperty साथ AudioFileOpenWithCallbacks साथ कि कैश खोलने के लिए और तो पढ़ kAudioFilePropertyID3Tag आप आईडी 3 डेटा पढ़ने में सक्षम हो सकते हैं (यदि यह मौजूद है)। जैसा कि मैंने कहा था: मैंने को वास्तव में ऐसा नहीं किया है इसलिए मैं नहीं जानता कि यह काम करेगा।

+0

आप इस काम की मिलती है, तो मुझे पता है:

PlayerItem.addObserver(self, forKeyPath: "timedMetadata", options: NSKeyValueObservingOptions.New, context: nil) 

इस विधि जोड़ें। – Moshe

+0

हाँ, iTunes में जब एक .m3u फ़ाइल स्ट्रीमिंग हो रही है, तो गीत और कलाकार जानकारी स्वचालित रूप से अपडेट हो जाती है। हो सकता है कि ID3v2 पूरे ट्रैक में हो - प्रत्येक ट्रैक की शुरुआत में, जैसा कि आपने कहा था। तो हो सकता है कि यह मेटाडेटा की प्रतीक्षा करने वाले इवेंट श्रोता की बात हो - मैं देख रहा हूं। – miketucker

+0

@ माइक हाँ।मैट कोड पर एक नज़र डालें, नवीनतम संस्करण गिटहब पर है। यह अच्छा संकेत प्रदान करना चाहिए। – Moshe

20

यह सुनिश्चित नहीं है कि यह प्रश्न अभी भी अपने लेखक के लिए वास्तविक है, लेकिन हो सकता है कि यह किसी की मदद करे। दो दिनों के दर्द के बाद मैंने जांच की कि यह काफी सरल है।

AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:<here your http stream url>]]; 

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil]; 

AVPlayer* player = [[AVPlayer playerWithPlayerItem:playerItem] retain]; 
[player play]; 

और उसके बाद:

- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object 
         change:(NSDictionary*)change context:(void*)context { 

    if ([keyPath isEqualToString:@"timedMetadata"]) 
    { 
     AVPlayerItem* playerItem = object; 

     for (AVMetadataItem* metadata in playerItem.timedMetadata) 
     { 
     NSLog(@"\nkey: %@\nkeySpace: %@\ncommonKey: %@\nvalue: %@", [metadata.key description], metadata.keySpace, metadata.commonKey, metadata.stringValue); 
     } 
    } 
} 

यह है कि यहाँ कोड है कि मेरे लिए काम करता है। मुझे नहीं पता कि ऐप्पल ने AVPlayerItem के लिए इस नमूने को स्ट्रीम के "शीर्षक" के लिए दस्तावेज़ों में क्यों प्रदान नहीं किया, जो असली दुनिया स्ट्रीमिंग ऑडियो के लिए मुख्य विशेषता है। "एवी फाउंडेशन फ्रेमवर्क संदर्भ" में वे "timedMetadata" के बारे में बताते हैं जहां कहीं भी आवश्यक है। और मैट का नमूना सभी धाराओं के साथ काम नहीं करता है (लेकिन AVPlayer करता है)।

+0

यह सुनिश्चित नहीं है कि इसे कभी भी सही उत्तर के रूप में क्यों चिह्नित नहीं किया गया था, लेकिन इसे वास्तव में चिह्नित किया जाना चाहिए। एक सतत धारा में, रेडियो ऐप के लिए, क्या किया जा सकता है जो वर्तमान ऑडियो फ़ाइल के बाद मेटाडेटा प्राप्त कर लेता है, और नया खेलना शुरू कर देता है? – user717452

+0

जब भी 'timedMetadata' मान बदल दिया जाता है तब उपर्युक्त कोड कॉल किया जाएगा। इस प्रकार जब एक वेब स्ट्रीम (इंटरनेट रेडियो की तरह) खेलते हैं तो 'ObsValueForKeyPath: ofObject: change: context:' परिवर्तन पर ट्रिगर किया जाएगा। – rckoenes

+0

ऊपर सही जवाब के रूप में चुना जाना चाहिए क्यों नहीं पता, लेकिन यह मुझे बहुत मदद करता है। आपका बहुत बहुत धन्यवाद। –

3
तेज 2.0 हो रही मेटाडाटा जानकारी संगीत स्ट्रीमिंग में

:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 

    //Atualiza Nome Musica 
    if keyPath == "timedMetadata" { 
     if let meta = PlayerItem.timedMetadata { 
      print("Novo Metadata \(meta)") 
      for metadata in meta { 
       if let nomemusica = metadata.valueForKey("value") as? String{ 
        LB_NomeMusica.text = nomemusica 
        if NSClassFromString("MPNowPlayingInfoCenter") != nil { 
         let image:UIImage = UIImage(named: "logo.gif")! 
         let albumArt = MPMediaItemArtwork(image: image) 
         var songInfo: [String:AnyObject] = [ 
          MPMediaItemPropertyTitle: nomemusica, 
          MPMediaItemPropertyArtist: "Ao Vivo", 
          MPMediaItemPropertyArtwork: albumArt 
         ] 
         MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = songInfo 
        } 
       } 
      } 
     } 
    } 


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