2017-03-15 12 views
13

मुझे एक एमपी 3 फ़ाइल डाउनलोड करने की आवश्यकता है, लेकिन मुझे केवल गीत के पहले 20 सेकंड (या गीत को 20 सेकंड से कम होने पर पूरा गीत) की आवश्यकता है।आईओएस - एमपी 3 फ़ाइल से केवल कुछ सेकंड डाउनलोड करें

func downloadSong(audioUrl: URL) { 

    let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 
    let destinationUrl = documentsDirectoryURL.appendingPathComponent(audioUrl.lastPathComponent) 

    URLSession.shared.downloadTask(with: audioUrl, completionHandler: { (location, response, error) -> Void in 
     guard let location = location, error == nil else { return } 
     do { 

      try FileManager.default.moveItem(at: location, to: destinationUrl) 
      // song available in destinationUrl 

     } catch let error as NSError { 

     } 
    }).resume() 
} 

वहाँ 20 सेकंड के बाद डाउनलोड को रोकने के लिए एक तरीका है:
यह कैसे मैं पूरे गीत डाउनलोड है? मुझे पता है कि मैं पूरा गीत डाउनलोड कर सकता हूं और फिर इसे काट सकता हूं, लेकिन मैं और अधिक कुशल होना चाहता हूं, खासकर यदि गीत बहुत लंबा है।

+1

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

+0

@ रेकिनिस यूआर सही मेरा मतलब अधिकतम 20 सेकेंड है, यह कम हो सकता है – Eyal

+1

संभव नहीं है मेरे ब्रो क्योंकि पहले गीत की जानकारी निर्धारित करते हैं और यह सुनिश्चित करने के बाद कि 20 सेकंड में डाउनलोड नहीं किया गया है और एमपी 3 प्ले जुर्माना संभव नहीं है, एमपी 3 –

उत्तर

7

एमपी 3 फ़ाइल एक छोटे ब्लॉकों में बांटा गया है - फ्रेम। प्रत्येक फ्रेम में स्थिर समय की लंबाई 0.026 सेकंड है। लेकिन एक फ्रेम का आकार (बाइट्स में) बिटरेट के अनुसार भिन्न होता है। उदाहरण के लिए। 128 केबीपीएस के लिए यह (सामान्यतः) 417 बाइट्स और 1 9 2 केबीपीएस 626 बाइट्स के लिए है। प्रत्येक फ्रेम के पहले 4 बाइट फ्रेम हेडर हैं और शेष ऑडियो डेटा है।

here से उद्धृत।

और प्रत्येक फ्रेम बजाने योग्य है। तो 20 डेटा के सेकंड के लिए, आपको लगभग 770 frames(20/0.026) की आवश्यकता है। तो पहले 770 फ़्रेम डाउनलोड करें और फिर डाउनलोड कार्य रद्द करें। फिर अपने डाउनलोड किए गए फ्रेम खेलें।

या आकार के अनुसार, 128kbps फ़ाइल के लिए डेटा के पहले 313.5 KB (गणना है: (417 Bytes*770)/1024) डाउनलोड करें। और आपको अपना 20 सेकंड डेटा मिलेगा।

+0

मुझे लगता है कि आपको यह भी जवाब देना चाहिए कि पहले '313.5 केबी' को कैसे डाउनलोड किया जाए। –

+0

यह वह उत्तर है जो मैंने दिया होगा। Upvoted। –

+0

को अभी भी यह जांचने का मौका नहीं मिला है, लेकिन यह अब तक का सबसे विस्तृत और व्यावहारिक उत्तर है, मैं बाद में परिणाम पर अपडेट करूंगा। धन्यवाद – Eyal

2

आपको ऑडियो फ़ाइल को 20 सेकंड में काटना होगा, फिर आप इसे डाउनलोड कर सकते हैं।

+0

हाँ, निश्चित रूप से जाने का रास्ता। इसके अलावा: सभी आईडी टैग। छीन लिया जाना चाहिए। सर्वर-साइड बैच स्क्रिप्ट का उपयोग करके, यह ऐसा कार्य करने का सबसे तेज़ और आसान तरीका है। अन्य सभी समाधानों को एमपी 3 फ़ाइल को पढ़ने की आवश्यकता होगी जब तक कि सभी ध्वनि फ्रेम की लंबाई 20 सेकंड तक नहीं पहुंच जाती है। – deblocker

2

मुझे अपने आवेदन में से किसी एक में भी ऐसी चुनौती का सामना करना पड़ा है। इसके बाद, बहुत कुछ खोजकर मैंने अंत में निष्कर्ष निकाला कि यह संभव नहीं है। mp3 फ़ाइल को डाउनलोड करने के रूप में इसकी आंतरिक algorithm है जो फ़्रेम के अनुसार काम करती है। तो, हम कुछ भी अनुमान लगा सकते हैं कि हमने कितने सेकंड या ऑडियो डाउनलोड किए हैं।

आगे, आप इस लिंक को देख सकते हैं।

Download last 30 seconds of an mp3

1

मेरी राय से यह निश्चित ही कुछ मान्यताओं के साथ संभव है:

  • सर्वर आंतरिक एमपी 3 संरचना में Content-Range हैडर
  • का समर्थन करना चाहिए आप (या अच्छा पुस्तकालय) कुछ ज्ञान की आवश्यकता

विचार:

इस गणना को सीमा में अनुरोध करके सर्वर से 500 केबी डाउनलोड करें। पार उंगलियों और खिलाड़ी को सीधे इस डेटा की आपूर्ति और देखो (या मैन्युअल रूप से शीर्ष लेख पार्स) क्या :)

  • आपूर्ति करने के लिए एमपी 3 अवगत पुस्तकालय डेटा प्राप्त होता है -

    1. तेज और गंदा: तो फिर तुम दो विकल्प होता है ।मेटाडेटा के अंदर पैच फ़ाइल की लंबाई और फिर
  • संबंधित मुद्दे