2012-11-24 36 views
8

से JavaFX में मेरे पास है एक आवश्यकता मैं एक के बजाय स्मृति में एमपी 3 बाइट डाटा हमारे पास है फ़ाइल ऑब्जेक्ट। कारण एमपी 3 फ़ाइल एन्क्रिप्टेड है और फिर प्रोग्राम के साथ भेज दिया गया है। इसलिए मुझे एमपी 3 फ़ाइल को स्मृति या इनपुट स्ट्रीम में डिक्रिप्ट करने की आवश्यकता है।एमपी 3 फ़ाइलें बजाना मैं कोड</p> <pre><code>new MediaPlayer(new Media(FileObject.toURI().toString())).play(); </code></pre> <p>अब तथापि निम्नलिखित एक एमपी 3 फ़ाइल का उपयोग कर खेलने के लिए JavaFX मीडिया प्लेयर का उपयोग कर रहा इनपुट धारा

मैं एमपी 3 फ़ाइल को temp निर्देशिका में एक अस्थायी फ़ाइल में डिक्रिप्ट कर सकता था लेकिन यह एक प्रदर्शन ओवरहेड होगा और ऑडियो सामग्री असुरक्षित होगी।

उत्तर

0

दुर्भाग्यवश मीडिया निर्माता के रूप में मुझे अस्थायी फ़ाइल दृष्टिकोण के अलावा ऐसा करने का कोई आसान तरीका नहीं दिखता है। ध्यान दें कि जब मैं सहमत हूं कि प्रदर्शन में ओवरहेड होगा, अगर फाइलें बहुत बड़ी नहीं हैं (ज्यादातर एमपी 3 फाइलें आम तौर पर नहीं होती हैं) तो इस अर्थ में ओवरहेड न्यूनतम होना चाहिए। और तकनीकी रूप से, स्मृति को सामग्री को डीकोड करने से यह असुरक्षित हो जाता है (हालांकि स्वीकार्य रूप से निकालने के लिए बहुत कठिन है।)

सॉकेट का उपयोग करने के बारे में मैंने सोचा था कि एक थोड़ा पागल दृष्टिकोण था। आप अपने एप्लिकेशन का एक अलग हिस्सा सेट कर सकते हैं जो अनएन्क्रिप्टेड सामग्री को डिक्रिप्ट करता है और फिर स्थानीयहोस्ट पर एक निश्चित बंदरगाह पर कच्चे एमपी 3 बाइट्स को स्ट्रीम करता है। इसके बाद आप मीडिया कन्स्ट्रक्टर को HTTP यूआरआई के रूप में प्रदान कर सकते हैं।

+0

मेमोरी में सामग्री को डीकोड करने के साथ आपको हार्ड डिस्क पर अस्थायी फ़ाइल का मतलब है? –

2

Media Javadoc

केवल HTTP, फ़ाइल, और जार यूआरएल से समर्थित हैं। यदि प्रदत्त यूआरएल अमान्य है तो एक अपवाद फेंक दिया जाएगा। यदि एक असीमित त्रुटि होती है, तो त्रुटि प्रॉपर्टी सेट की जाएगी। ऐसी किसी भी त्रुटि की अधिसूचना के लिए इस संपत्ति को सुनो।

मैं जावाएफएक्स से व्यक्तिगत रूप से परिचित नहीं हूं, लेकिन यह मुझे सुझाव देगा कि बुरा हैक्स का उपयोग किए बिना, आप सीधे स्मृति से मीडिया को पढ़ने में सक्षम नहीं होंगे। आम तौर पर इस प्रकार के यूआरआई केवल इंटरफ़ेस के लिए मैं एक कस्टम UrlStreamHandler और स्मृति से पढ़ता एक कस्टम प्रोटोकॉल पंजीकृत करने का सुझाव देना चाहता हूं। लेकिन यह मानते हुए कि जावाडॉक सही है, जावाएफएक्स अपने स्वयं के संकल्प का उपयोग करता है, इसलिए संभवतः यह काम नहीं करेगा।

यह देखते हुए मुझे संदेह है कि यह काम करने का एकमात्र तरीका HTTP पर इन-मेमोरी एमपी 3 तक पहुंच प्रदान करना है। आप Jetty या किसी भी समान एम्बेड करने योग्य सर्वलेट कंटेनर का उपयोग करके ऐसा कर सकते हैं। निम्नलिखित लाइनों के साथ कुछ:

1) ऊपर जेट्टी प्रारंभ के रूप में Quick Start Guide

2) एक सर्वलेट कि नीचे तरह दिखता रजिस्टर प्रति।

public class MagicAccessServlet extends HttpServlet { 
    private static final Map<String, byte[]> mediaMap = new ConcurrentHashMap(); 

    public static String registerMedia(byte[] media) { 
     String key = UUID.randomUUID().toString(); 
     mediaMap.put(key, media); 
     return key; 
    } 

    public static deregisterMedia(String key) { 
     mediaMap.remove(key); 
    } 

    public void doGet(HttpServletRequest req, HttpServletResponse resp) { 
     String key = req.get("key"); 
     byte[] media = mediaMap.get(key); 
     resp.setContentLength(media.length); 
     resp.getOutputStream().write(media); 
    } 
} 

तो फिर आप अपने आवेदन एक http यूआरएल का उपयोग कर के भीतर से एक्सेस कर सकते हैं: यह सर्वलेट अपने इन-मेमोरी डेटा सामने आ जाएगी। जैसे

MagicAccessServlet.registerMedia(decodedMp3); 
new MediaPlayer(new Media("http://localhost:<port>/<context>/<servlet>?key=" + key)).play();  
+0

एडीसी: मैं आपके प्रस्ताव को लागू करने की कोशिश कर रहा हूं, हालांकि मैं इस पर फंस गया हूं: http://stackoverflow.com/questions/14627114/jetty-and-or-servlet-api-in-javafx-breaks-deployment आप कृपया मेरी मदद करो? – Csabi