2017-02-08 7 views
14

में सर्वर संगीत को चलाने और चलाने के लिए मैंने तेजी से भाषा के साथ remote url ऑडियो बफर करने और तुरंत चलाने की कोशिश की।एवीप्लेयर बहुत लंबा और तैयार होने में देरी के साथ

लेकिन समस्या readyToPlay केस और प्ले के लिए लंबे समय से है।

उदाहरण के लिए ध्वनि ध्वनि में चलाने के लिए लगभग 12 से 15 सेकंड लगते हैं।

override func observeValue(forKeyPath keyPath: String?,of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 

    guard context == &playerItemContext else { 
     super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) 
     return 
    } 

    if keyPath == #keyPath(AVPlayerItem.status) { 
     let status: AVPlayerItemStatus 
     if let statusNumber = change?[.newKey] as? NSNumber { 
      status = AVPlayerItemStatus(rawValue: statusNumber.intValue)! 
     } else { 
      status = .unknown 
     } 
     // Switch over status value 
     switch status { 
     case .readyToPlay: 
      print("readyToPlay \(status.rawValue)") 
      player.play() // here play remote sound 
     case .failed: 
      print("readyToPlay \(status.rawValue)") 
     case .unknown: 
      print("failed \(status.rawValue)") 
     } 

    } 
} 
:

var asset: AVAsset! 
var player: AVPlayer! 
var playerItem: AVPlayerItem! 

private var playerItemContext = 0 

let requiredAssetKeys = [ "playable","hasProtectedContent"] 

let url = URL(string: "http://sound_link.mp3")! 
asset = AVAsset(url: url) 

playerItem = AVPlayerItem(asset: asset, 
           automaticallyLoadedAssetKeys: requiredAssetKeys) 
playerItem.addObserver(self, 
         forKeyPath: #keyPath(AVPlayerItem.status), 
         options: [.old, .new], 
         context: &playerItemContext) 

player = AVPlayer(playerItem: playerItem) 

कि इस (ExploringAVFoundation) documentation've done that

करने के लिए और है कि खिलाड़ी को संभालने के लिए अनुसार खिलाड़ी के लिए तैयार है मैं observeValue func का उपयोग खेलने के लिए:

इस

मेरी कोड है

और इस लौटा दिया जाता है लॉग:

2017-02-08 13:44:00.626036 [15144:3747850] [aqme] 255: AQDefaultDevice (1): skipping input stream 0 0 0x0 
readyToPlay 1 
2017-02-08 13:44:02.631182 [15144:3747850] [aqme] 255: AQDefaultDevice (173): skipping input stream 0 0 0x0 
ऊपर लॉग में

, 4 सेकंड ले readyToPlay 1 प्रकट करने के लिए तो ध्वनि

Sever गति अच्छा है खेलने के लिए 10 सेकंड लेने के लिए और मैं Android और अधिकतम में सर्वर ध्वनि चलाने के लिए करने की कोशिश की बफर करने और ध्वनि चलाने का समय लगभग 3 सेकंड है। (Android एप्लिकेशन में) लेकिन IOS में बफरिंग और ध्वनि पूरी तरह से खेलते हैं, पूरी तरह से लगभग 15 सेकंड लेते हैं!

URL के साथ अपनी avPlayerItem का दृष्टांत और उसके बाद वैश्विक सूत्र में अन्य परिसंपत्तियों को लाने के लिए आपका ध्यान के लिए धन्यवाद

+0

क्या आपकी समस्या है कि आईओएस के लिए इसे चलाने योग्य बनाने के लिए पर्याप्त फ़ाइल डाउनलोड करने में बहुत लंबा समय लगता है? क्या आप उस फ़ाइल के लिंक को पोस्ट कर सकते हैं जिसके साथ आप परीक्षण कर रहे हैं ताकि हम कुछ तुलना कर सकें? –

+0

@ डेववेस्टन, कोई लिंक नहीं है - मैंने कई लिंक की कोशिश की - लिंक भी 'एंड्रॉइड' में सही तरीके से काम करते हैं लेकिन 'आईओएस' – Saeid

+0

में नहीं, कारण मैं पूछता हूं क्योंकि मेरे परीक्षणों में, ध्वनि लगभग तुरंत खेलना शुरू कर देती है। मैंने आपके प्रश्न से कोड लिया, और इस यूआरएल का इस्तेमाल किया: http://www.mfiles.co.uk/mp3-downloads/frederic-chopin-piano-sonata-2-op35-3-funeral-march.mp3 –

उत्तर

3

कोशिश, मुझे लगता है कि समस्याओं इसलिए होता है क्योंकि avPlayer मुख्य यूआई धागा मैं था में संपत्ति लाने के लिए कोशिश कर रहा है एक ही समस्या है जब मैं avAssets से उपशीर्षक विकल्प को पढ़ने के लिए कोशिश कर रहा था यह 5-6 सेकंड अधिक ले लिया मेरी खिलाड़ी में फिल्म लोड करने के लिए

यह कैसे मैं (स्विफ्ट 2 में) मेरी समस्या हल है, मुझे आशा है कि यह मदद करता है:

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
      let avMediaSelectionGroup : AVMediaSelectionGroup? = self.container.player.currentItem?.asset.mediaSelectionGroupForMediaCharacteristic(AVMediaCharacteristicLegible) 
      dispatch_async(dispatch_get_main_queue(), { 

       if (avMediaSelectionGroup != nil && (avMediaSelectionGroup!.options.count != 0) && avMediaSelectionGroup?.options[0].valueForKey("title") != nil) 
       { 
        // show hide subtitle button 
       } 

      }) 

     }) 
+0

मैं DispatchQueue.global (क्यूओएस अंदर सवालों के कोड के दूसरे भाग डालने की कोशिश की अद्यतन: .userInitiated) .async {code}, readyToPlay तेजी से तैयार है लेकिन play sound के लिए अभी तक कई सेकंड लगते हैं! – Saeid

6

कोशिश यह उपयोग करने के लिए:

player.automaticallyWaitsToMinimizeStalling = false 
+0

https://developer.apple.com/reference/avfoundation/avplayer/1643482-automaticallywaitstominimizestal के अनुसार, यह सुविधा आईओएस 10.0 कम संस्करण – Saeid

+0

@ सेइड नहीं है, हां यह है, लेकिन जैसा कि मैं समझता हूं, पूर्व संस्करणों के लिए यह काम करता है जैसे कि यह संपत्ति झूठी थी; आईओएस 10 में यह डिफ़ॉल्ट रूप से सच है। यह मेरे मुद्दे को हल करता है –

+0

इसका उपयोग नहीं किया जा सकता है - क्योंकि इसे परिस्थितियों और हैंडल आईओएस संस्करण – Saeid

1

मैं AVPlayer के साथ एक ही देरी खेल समस्या है। सैम लैन के भीतर मेरा आईफोन के अलावा स्रोत यूआरएल मेरा मैक है। और देरी का समय 6 सेकंड से 12 सेकंड तक है। https://stackoverflow.com/users/4083045/vlad-hatko @Vlad Hatko के जवाब ने इसे हल करने में मदद की। बहुत धन्यवाद। बस "player.automaticallyWaitsToMinimizeStalling = false" जोड़ना एक आकर्षण की तरह देरी की समस्या हल करता है!

+0

12 सेकंड बहुत लंबा है, एंड्रॉइड डली समय में एक ही यूआरएल के साथ 2 से 6 सेकंड के बीच है। – Saeid

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