2015-05-14 12 views
5

के लिए आर्टवर्क प्रदर्शित करना मैं वर्तमान में एक स्थानीय रूप से संग्रहीत एमपी 3 ट्रैक के लिए एल्बम आर्टवर्क प्रदर्शित करने की कोशिश कर रहा हूं। क्या कोई यह जानता है कि इसे पूरा करने के लिए स्विफ्ट में इस कलाकृति को कैसे लाया जाए?एमपी 3 फ़ाइल

मुझे यह समाधान मिला है (iOS AVFoundation: How do I fetch artwork from an mp3 file?) लेकिन कोड उद्देश्य सी में लिखा गया है। मैं बस अपने एमपी 3 में एम्बेडेड छवि को पकड़ना चाहता हूं और इसे अपने छवि दृश्य में प्रदर्शित करना चाहता हूं।

मैंने MPMediaItemArtwork के लिए एपीआई दस्तावेज को देखा है और एक उदाहरण मिला है जो मैं उद्देश्य सी में भी पूरा करने की कोशिश कर रहा हूं (http://www.codeitive.com/0zHjkUjUWX/not-able-to-get-the-uiimage-from-mpmediaitempropertyartwork.html) लेकिन समाधान के साथ नहीं आ सकता। मेरा कोड निम्नानुसार है:

import UIKit 
import AVFoundation 
import MediaPlayer 

class ViewController: UIViewController { 
let audioPath:NSURL! = NSBundle.mainBundle().URLForResource("SippinOnFire", withExtension: "mp3") 

@IBOutlet var artistImage: UIImageView! 
@IBOutlet var trackLabel: UILabel! 
@IBOutlet var artistLabel: UILabel! 
@IBOutlet var sliderValue: UISlider! 
var player:AVAudioPlayer = AVAudioPlayer() 


@IBAction func play(sender: AnyObject) { 


    let audioInfo = MPNowPlayingInfoCenter.defaultCenter() 
println(audioInfo) 


    player.play() 
    //println("Playing \(audioPath)") 


    let playerItem = AVPlayerItem(URL: audioPath) 
    let metadataList = playerItem.asset.metadata as! [AVMetadataItem] 


    for item in metadataList { 
     if let stringValue = item.value { 
      println(item.commonKey) 
      if item.commonKey == "title" { 
       trackLabel.text = stringValue as? String 
      } 
      if item.commonKey == "artist" { 
       artistLabel.text = stringValue as? String 
      } 
      if item.commonKey == "artwork" { 
       if let audioImage = UIImage(data: item.value as! NSData) { 
        let audioArtwork = MPMediaItemArtwork(image: audioImage) 
        println(audioImage.description) 
       } 
      } 


     } 
    } 
} 
@IBAction func pause(sender: AnyObject) { 

    player.pause() 
} 
@IBAction func stop(sender: AnyObject) { 

    player.stop() 
    player.currentTime = 0; 
} 
@IBAction func sliderChanged(sender: AnyObject) { 

    player.volume = sliderValue.value 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 

      var error:NSError? = nil 

    player = AVAudioPlayer(contentsOfURL: audioPath!, error: &error) 

    player.volume = 0.5; 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

यहां मेरे नमूना .mp3 फ़ाइल का एक स्क्रीन शॉट है। जैसा कि आप देख सकते हैं कि वास्तव में एल्बम आर्टवर्क है जो खोजक के "जानकारी प्राप्त करें" खंड में दिखाई देता है। मैंने यह सुनिश्चित करने के लिए अपने आईट्यून्स में। एमपी 3 भी खोला है और पुष्टि की है कि वहां "आर्टवर्क" टैब के साथ-साथ "जानकारी प्राप्त करें" अनुभाग में कलाकृति भी है।

हालांकि, मेरी छवि पर छवि को असाइन करने के लिए आमके का उपयोग करने का प्रयास करते समय मुझे लगता है कि "आर्टवर्क" के लिए कोई आम बात नहीं है।

sample MP3 data

धन्यवाद

उत्तर

6

इस कोड में अपना स्निपेट बदलें (मैं पहले से ही टेस टेड यह):

I added println lines commented in places of interest, Feel free to uncomment in order to see what is happening.

for item in metadataList { 
     if item.commonKey == nil{ 
      continue 
     } 

     if let key = item.commonKey, let value = item.value { 
      //println(key) 
      //println(value) 
      if key == "title" { 
       trackLabel.text = value as? String 
      } 
      if key == "artist" { 
       artistLabel.text = value as? String 
      } 
      if key == "artwork" { 
       if let audioImage = UIImage(data: value as! NSData) { 
        //println(audioImage.description) 
        artistImage.image = audioImage 
       } 
      } 
     } 
    } 

UPDATE: A bit of clean up of this code

for item in metadataList { 

    guard let key = item.commonKey, let value = item.value else{ 
     continue 
    } 

    switch key { 
    case "title" : trackLabel.text = value as? String 
    case "artist": artistLabel.text = value as? String 
    case "artwork" where value is NSData : artistImage.image = UIImage(data: value as! NSData) 
    default: 
     continue 
    } 
} 
+0

बिल्कुल सही! यह वह समाधान था जो मेरे लिए काम करता था! आपकी सहायता के लिए धन्यवाद. तो क्या .comonmetadata के बजाय मेटाडेटा का उपयोग करना सही था? क्या दूसरे की तुलना में मेटाडेटा की गहराई से कवरेज में एक और है? कुडोस और चीयर्स! – Unconquered82

3

इस तरह का प्रयास करें:

let audioInfo = MPNowPlayingInfoCenter.defaultCenter() 
var nowPlayingInfo:[String:AnyObject] = [:] 
let playerItem = AVPlayerItem(URL: url) 
let metadataList = playerItem.asset.metadata 
for item in metadataList { 
    if item.commonKey != nil && item.value != nil { 
     if item.commonKey == "title" { 
      println(item.stringValue) 
      nowPlayingInfo[MPMediaItemPropertyTitle] = item.stringValue 
     } 
     if item.commonKey == "type" { 
      println(item.stringValue) 
      nowPlayingInfo[MPMediaItemPropertyGenre] = item.stringValue 
     } 
     if item.commonKey == "albumName" { 
      println(item.stringValue) 
      nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = item.stringValue 
     } 
     if item.commonKey == "artist" { 
      println(item.stringValue) 
      nowPlayingInfo[MPMediaItemPropertyArtist] = item.stringValue 
     } 
     if item.commonKey == "artwork" { 
      if let image = UIImage(data: item.dataValue) { 
       nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(image: image) 
       println(image.description) 
      } 
     } 
    } 
} 

audioInfo.nowPlayingInfo = nowPlayingInfo 

ध्यान दें: आप beginReceivingRemoteControlEvents() आह्वान अन्यथा यह वास्तविक डिवाइस पर काम नहीं करेगा करना होगा।

यह है कि कभी कभी प्रकट होता है:

do { 
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
    print("AVAudioSession Category Playback OK") 
    do { 
     try AVAudioSession.sharedInstance().setActive(true) 
     print("AVAudioSession is Active") 
    } catch let error as NSError { 
     print(error.localizedDescription) 
    } 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 

enter image description here

+0

मैं ऊपर पहले से ही पिछले, लेकिन वहाँ "कलाकृति" सूचीबद्ध तो छवि फ़ाइल में कहीं और भंडारण किया जाना चाहिए के लिए कोई commonKey है कोड की कोशिश की। जब मैं अपने commonKey आइटम println सभी को प्रदर्शित करता है कि है [शीर्षक प्रकार कॉपीराइट ALBUMNAME कलाकार] अगर मैं फ़ाइल मैं स्पष्ट रूप से दोनों पूर्वावलोकन अनुभाग में एमपी 3 के लिए कलाकृति को देख सकते हैं पर "जानकारी प्राप्त" के साथ-साथ आईट्यून्स में "आर्टवर्क" टैब के तहत कलाकृति। हालांकि, कोई "आर्टवर्क" आम नहीं है जिसका उपयोग इसे कैप्चर करने के लिए किया जा सकता है। – Unconquered82

+0

यह फ़ाइल से जानकारी निकालने जा रहा है, आपके गीत पर शायद कोई कलाकृति नहीं है। सुनिश्चित करें कि आपकी एमपी 3 फ़ाइल में एम्बेडेड आर्टवर्क –

+0

है, मैंने ट्रैक प्रश्न की स्क्रीन शॉट शामिल करने के लिए अपना प्रश्न अपडेट कर लिया है।जैसा कि आप देख सकते हैं। एमपी 3 में एम्बेडेड कलाकृति है। मैंने आईट्यून्स में "आर्टवर्क" टैब का दूसरा स्क्रीन शॉट नहीं लिया, लेकिन कलाकृति भी वहां दिखाई देती है। – Unconquered82

0

इस प्रयास करें: आप अपने एप्लिकेशन पृष्ठभूमि मोड (ऑडियो और AirPlay) की स्थापना की और AVAudioSessionCategoryPlayback करने के लिए अपने AVAudioSession श्रेणी सेट और इसे सेट सक्रिय करने की आवश्यकता होगी आईओएस 8 इस जानकारी को प्राप्त करने के पहले प्रयास पर शून्य लौटाता है:

if let audioCenter = MPNowPlayingInfoCenter.defaultCenter(){ 
     if let audioInfo = audioCenter.nowPlayingInfo{ 
      if let artwork = audioInfo[MPMediaItemPropertyArtwork] as? MPMediaItemArtwork 
      { 
       var image: UIImage? = artwork.imageWithSize(artwork.bounds.size) 

       if image == nil { 
        image = artwork.imageWithSize(artwork.bounds.size); 
       } 

       if image != nil{ 
        println("image loaded") 
       } 
      } 
     } 
    } 
संबंधित मुद्दे