दिलचस्प पोस्ट
फ़ंक्शन के पास जाने के बाद चर का मूल नाम निर्धारित करें कैफ लॉग को debug_info के साथ कैसे करें? $ रूट स्कोप तक नहीं जा सकता LINQ कुल एल्गोरिथ्म समझाया आप एक बुफ़ेदार छवि कैसे क्लोन करते हैं पहला अनुक्रम आइटम ढूंढें जो मानदंड से मेल खाता है दो-आयामी सरणी के लिए एक सूचक बनाएं ब्राउज़र भाषा प्राथमिकता का पता लगाने के लिए जावास्क्रिप्ट क्या वेब साइट्स को वास्तव में ब्राउज़रों के लिए पूरा करने की आवश्यकता है जिनके पास जावास्क्रिप्ट सक्षम नहीं है? आई ++ परमाणु क्यों नहीं है? जावास्क्रिप्ट एक फाइल सिस्टम तक पहुंच सकता है? मैं वाइल्डकार्ड / एस्टरिक वर्ण से कैसे बचता हूं? <F: मेटाडाटा>, <f: viewParam> और <f: viewAction> के लिए क्या इस्तेमाल किया जा सकता है? एकाधिक INNER SQL एक्सेस में शामिल हों मापदंडों के साथ कमांड को कैसे कार्यान्वित करें?

मीडिया प्लेयर कैश तक पहुंच प्राप्त करना

मैं पूरी तरह से भरी हुई है, जब मैं एक एसडी कार्ड के लिए एक उत्तरोत्तर स्ट्रीमिंग एमपी 3 फ़ाइल को स्थानांतरित करना चाहते हैं। क्या उसको प्राप्त करने का कोई तरीका है?

मैंने देखा है कि MediaPlayer संपूर्ण फ़ाइल को पूरी तरह से डाउनलोड करता है, जबकि प्रगतिशील स्ट्रीमिंग और फिर हम फ़ाइल के किसी भी भाग की तलाश कर सकते हैं। मैं एक पूरी तरह से स्ट्रीम की गई फ़ाइल को बाहरी संग्रहण में ले जाना चाहता हूं ताकि भविष्य के प्लेबैक में डेटा और बैटरी बर्बाद न हो जाए

वेब के समाधान से एकत्रित समाधान "मीडिया प्लेयर कैश तक पहुंच प्राप्त करना"

मूल पोस्ट पर टिप्पणी आपको सही दिशा में बताती है, लेकिन मैंने सोचा कि यह थोड़ा सा व्याख्या करने में सहायक हो सकता है …

मैंने क्या किया है नागा और अपाचे HTTP पुस्तकालयों का उपयोग कर हल्के प्रॉक्सी सर्वर का निर्माण इस भाग की मूल बातें प्राप्त करने के लिए वहां बहुत सारे उदाहरण मौजूद होने चाहिए। मीडियाप्लेयर को एक उपयुक्त स्थानीयहोस्ट यूआरएल प्रदान करें ताकि वह आपके प्रॉक्सी में सॉकेट खोल सके। जब मीडियाप्लेयर अनुरोध करता है, तो वास्तविक मीडिया होस्ट के समकक्ष अनुरोध भेजने के लिए प्रॉक्सी का उपयोग करें। आपको प्रॉक्सी के पैकेट रीसाइज्ड विधि में बाइट [] डेटा प्राप्त होगा, जिसे मैं एचटीटीपीएगेट बनाने और इसे AndroidHttpClient के साथ अपने रास्ते पर भेजने के लिए उपयोग करता हूं।

आप एक एचटीटीपी रेस्पॉन्स वापस ले लेंगे और स्ट्रीमिंग बाइट डेटा तक पहुंचने के लिए आप एचटीटीपीटीईटीटी का उपयोग कर सकते हैं। मैं एक readableByteChannel का उपयोग कर रहा हूं, जैसे:

 HttpEntityWrapper entity = (HttpEntityWrapper)response.getEntity(); ReadableByteChannel src = Channels.newChannel(entity.getContent()); 

जो भी डेटा के साथ आप चाहें उसे वापस पढ़ लें (जैसे कि एसडी कार्ड पर फ़ाइल में कैश करें)। मीडियाप्लेयर पर सही सामान पास करने के लिए, ग्राहक सॉकेट से सॉकेट चैनल प्राप्त करें, सबसे पहले उस चैनल पर सीधे प्रतिसाद हेडर लिखें, और फिर इकाई के बाइट डेटा को लिखना जारी रखें। मैं थोड़ी देर में एक एनआईओ बाइटबफर का उपयोग कर रहा हूं (क्लाइंट एक सॉकेट है और बफर एक बाइटबफर है)।

 int read, written; SocketChannel dst = client.getChannel(); while (dst.isConnected() && dst.isOpen() && src.isOpen() && (read = src.read(buffer)) >= 0) { try { buffer.flip(); // This is one point where you can access the stream data. // Just remember to reset the buffer position before trying // to write to the destination. if (buffer.hasRemaining()) { written = dst.write(buffer); // If the player isn't reading, wait a bit. if (written == 0) Thread.sleep(15); buffer.compact(); } } catch (IOException ex) { // handle error } } 

आपको उस खिलाड़ी के साथ इसे पास करने से पहले प्रतिक्रिया में मेजबान हेडर को बदलना पड़ सकता है, ताकि यह दिखता है कि आपका प्रॉक्सी प्रेषक है, लेकिन मैं मीडियाप्लेयर के मालिकानापन के साथ काम कर रहा हूं, इसलिए व्यवहार थोड़ा अलग हो सकता है। उम्मीद है की वो मदद करदे।

यह विचार एक प्रॉक्सी बनाना है जो मीडिया प्लेयर सीधे वेब से डेटा पढ़ने के बजाय, पढ़ सकता है

मैंने डैनिकुला / एंड्रॉइड वीडियो कैच का उपयोग किया है जो निर्माण / प्रयोग करने में बहुत सरल है। मैं इसे ऑडियो नहीं वीडियो के लिए प्रयोग किया था, लेकिन इसकी सिर्फ एक ही है

इसके देर हो गए लेकिन मुझे पता चला कि ज्यादातर लोगों को अभी भी समाधान की आवश्यकता है मेरा समाधान जेकहॉर्टन के डिस्कलूकैश पर आधारित है। हमें दो चीजों की जरूरत है

  • फ़ाइल पढ़ने या नेटवर्क से डाउनलोड करने और इसे कैश करने के लिए AsyncTask

  • कैश से इनपुटस्ट्राम / फाइल डिस्क्रिप्टर प्राप्त करने के लिए कॉलबैक

चरण 1:

 import android.content.Context; import android.os.AsyncTask; import org.apache.commons.io.IOUtils; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; // you can use FileDescriptor as // extends AsyncTask<String, Void, FileDescriptor> public class AudioStreamWorkerTask extends AsyncTask<String, Void, FileInputStream> { private OnCacheCallback callback = null; private Context context = null; public AudioStreamWorkerTask(Context context, OnCacheCallback callback) { this.context = context; this.callback = callback; } @Override protected FileInputStream doInBackground(String... params) { String data = params[0]; // Application class where i did open DiskLruCache DiskLruCache cache = MyApplication.getDiskCache(context); if (cache == null) return null; String key = hashKeyForDisk(data); final int DISK_CACHE_INDEX = 0; long currentMaxSize = cache.getMaxSize(); float percentageSize = Math.round((cache.size() * 100.0f) / currentMaxSize); if (percentageSize >= 90) // cache size reaches 90% cache.setMaxSize(currentMaxSize + (10 * 1024 * 1024)); // increase size to 10MB try { DiskLruCache.Snapshot snapshot = cache.get(key); if (snapshot == null) { Log.i(getTag(), "Snapshot is not available downloading..."); DiskLruCache.Editor editor = cache.edit(key); if (editor != null) { if (downloadUrlToStream(data, editor.newOutputStream(DISK_CACHE_INDEX))) editor.commit(); else editor.abort(); } snapshot = cache.get(key); } else Log.i(getTag(), "Snapshot found sending"); if (snapshot != null) return (FileInputStream) snapshot.getInputStream(DISK_CACHE_INDEX); } catch (IOException e) { e.printStackTrace(); } Log.i(getTag(), "File stream is null"); return null; } @Override protected void onPostExecute(FileInputStream fileInputStream) { super.onPostExecute(fileInputStream); if (callback != null) { if (fileInputStream != null) callback.onSuccess(fileInputStream); else callback.onError(); } callback = null; context = null; } public boolean downloadUrlToStream(String urlString, OutputStream outputStream) { HttpURLConnection urlConnection = null; try { final URL url = new URL(urlString); urlConnection = (HttpURLConnection) url.openConnection(); InputStream stream = urlConnection.getInputStream(); // you can use BufferedInputStream and BufferOuInputStream IOUtils.copy(stream, outputStream); IOUtils.closeQuietly(outputStream); IOUtils.closeQuietly(stream); Log.i(getTag(), "Stream closed all done"); return true; } catch (final IOException e) { e.printStackTrace(); } finally { if (urlConnection != null) IOUtils.close(urlConnection); } return false; } private String getTag() { return getClass().getSimpleName(); } private String hashKeyForDisk(String key) { String cacheKey; try { final MessageDigest mDigest = MessageDigest.getInstance("MD5"); mDigest.update(key.getBytes()); cacheKey = bytesToHexString(mDigest.digest()); } catch (NoSuchAlgorithmException e) { cacheKey = String.valueOf(key.hashCode()); } return cacheKey; } private String bytesToHexString(byte[] bytes) { // http://stackoverflow.com/questions/332079 StringBuilder sb = new StringBuilder(); for (byte aByte : bytes) { String hex = Integer.toHexString(0xFF & aByte); if (hex.length() == 1) sb.append('0'); sb.append(hex); } return sb.toString(); } } 

चरण 2:

 public interface OnCacheCallback { void onSuccess(FileInputStream stream); void onError(); } 

उदाहरण

 final String path = "http://www.example.com/test.mp3"; new AudioStreamWorkerTask (TestActivity.this, new OnCacheCallback() { @Override public void onSuccess(FileInputStream fileInputStream) { Log.i(getClass().getSimpleName() + ".MediaPlayer", "now playing..."); if (fileInputStream != null) { // reset media player here if necessary mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(fileInputStream.getFD()); mediaPlayer.prepare(); mediaPlayer.setVolume(1f, 1f); mediaPlayer.setLooping(false); mediaPlayer.start(); fileInputStream.close(); } catch (IOException | IllegalStateException e) { e.printStackTrace(); } } else { Log.e(getClass().getSimpleName() + ".MediaPlayer", "fileDescriptor is not valid"); } } @Override public void onError() { Log.e(getClass().getSimpleName() + ".MediaPlayer", "Can't play audio file"); } }).execute(path); 

ध्यान दें:

यह परीक्षण किया गया है लेकिन ऑडियो फ़ाइल कैशिंग के लिए किसी न किसी प्रकार का नमूना है, अगर आपको कुछ भी मिल जाए तो मुझे कुछ समस्याएं हो सकती हैं 🙂