के साथ काम नहीं करती है। मैं बैकएंड पर टेपेस्ट्री 5 (5.3.5) के साथ एचटीएमएल 5 वीडियो टैग के माध्यम से अपने आईपैड में एक वीडियो स्ट्रीम करना चाहता हूं। आम तौर पर सर्वरसाइड ढांचे को इसमें कोई भूमिका नहीं निभानी चाहिए लेकिन किसी भी तरह से यह करता है।आईपैड पर वीडियो स्ट्रीमिंग टेपेस्ट्री 5
वैसे भी, उम्मीद है कि यहां कोई मेरी मदद कर सकता है। कृपया ध्यान रखें कि मेरी परियोजना बहुत प्रोटोटाइप है और जो मैंने वर्णन किया है वह प्रासंगिक भागों में सरलीकृत/कम हो गया है। अगर लोग अनिवार्य "आप गलत काम करना चाहते हैं" या सुरक्षा/प्रदर्शन नाइटपिक्स के साथ प्रतिक्रिया नहीं देते हैं, तो समस्या के लिए प्रासंगिक नहीं हैं, तो मैं इसकी बहुत सराहना करता हूं।
तो यहाँ यह जाता है:
सेटअप
मैं एक वीडियो एप्पल एचटीएमएल 5 से लिया प्रदर्शन इसलिए मुझे पता है कि प्रारूप एक मुद्दा नहीं है। मेरे पास एक साधारण टीएमएल पेज "प्ले" है जिसमें सिर्फ "वीडियो" टैग है।
समस्या
मैं एक RequestFilter कि संदर्भित वीडियो फ़ाइल को खोलने और ग्राहक को स्ट्रीमिंग द्वारा वीडियो नियंत्रण से अनुरोध हैंडल को लागू करने से शुरू कर दिया। यह मूलभूत है "यदि पथ 'फ़ाइल' से शुरू होता है तो आउटपुटस्ट्रीम प्रतिक्रिया के लिए फ़ाइल इनपुटस्ट्रीम कॉपी करें"। यह क्रोम के साथ बहुत अच्छी तरह से काम करता है लेकिन आईपैड के साथ नहीं। ठीक है, हालांकि, मुझे कुछ शीर्षलेख होना चाहिए जो मुझे याद आ रही हैं इसलिए मैंने ऐप्पल शोकेस को दोबारा देखा और उसी हेडर और सामग्री के प्रकार को शामिल किया लेकिन कोई खुशी नहीं।
अगला, हालांकि, मैं देखता हूं कि क्या होता है यदि मैं फ़ाइल को टी 5 सेवा देता हूं। मैंने वीडियो को वेबपैड संदर्भ में कॉपी किया, मेरे अनुरोध फ़िल्टर को अक्षम कर दिया और वीडियो के स्रोत विशेषता में सरल फ़ाइल नाम डाला। यह क्रोम और आईपैड में काम करता है। मुझे आश्चर्य हुआ और मुझे यह देखने के लिए प्रेरित किया कि टी 5 स्थिर फाइल/संदर्भ अनुरोध कैसे संभालता है। इस प्रकार तक अब तक मुझे यह महसूस हुआ है कि दो अलग-अलग पथ हैं जिन्हें मैंने एक @Path ("संदर्भ:") के साथ एक संपत्ति में हार्डवार्ड "वीडियो स्रोत" को स्विच करके पुष्टि की है। यह फिर से क्रोम पर काम करता है लेकिन आईपैड पर नहीं।
तो मैं वास्तव में यहां खो गया हूं। "सरल संदर्भ" अनुरोधों में यह गुप्त रस क्या है जो इसे आईपैड पर काम करने की अनुमति देता है? कुछ खास नहीं चल रहा है और फिर भी यह काम करता है। समस्या यह है, मैं वास्तव में मेरे webapp संदर्भ से उन vids की सेवा नहीं कर सकते हैं ...
समाधान
तो, यह पता चला है कि इसे http हैडर "रेंज" कहा जाता है कि वहाँ और कहा कि iPad, के विपरीत क्रोम का उपयोग करता है यह वीडियो के साथ। तब "गुप्त सॉस" यह है कि स्थिर संसाधन अनुरोध के लिए सर्वलेट हैंडलर जानता है कि T5 के दौरान रेंज अनुरोधों से निपटने का तरीका कैसे है। यहां मेरा कस्टम कार्यान्वयन है:
OutputStream os = response.getOutputStream("video/mp4");
InputStream is = new BufferedInputStream(new FileInputStream(f));
try {
String range = request.getHeader("Range");
if(range != null && !range.equals("bytes=0-")) {
logger.info("Range response _______________________");
String[] ranges = range.split("=")[1].split("-");
int from = Integer.parseInt(ranges[0]);
int to = Integer.parseInt(ranges[1]);
int len = to - from + 1 ;
response.setStatus(206);
response.setHeader("Accept-Ranges", "bytes");
String responseRange = String.format("bytes %d-%d/%d", from, to, f.length());
logger.info("Content-Range:" + responseRange);
response.setHeader("Connection", "close");
response.setHeader("Content-Range", responseRange);
response.setDateHeader("Last-Modified", new Date().getTime());
response.setContentLength(len);
logger.info("length:" + len);
byte[] buf = new byte[4096];
is.skip(from);
while(len != 0) {
int read = is.read(buf, 0, len >= buf.length ? buf.length : len);
if(read != -1) {
os.write(buf, 0, read);
len -= read;
}
}
} else {
response.setStatus(200);
IOUtils.copy(is, os);
}
} finally {
os.close();
is.close();
}
यह उपयोगी जानकारी है; ऐसा कोई कारण नहीं है कि टेपेस्ट्री मानक मानक हैंडलिंग कोड के अंदर स्वचालित रूप से इसे संभाल नहीं सकता है; हम सिर्फ इतना नहीं जानते कि इसे करने की ज़रूरत है। हमारे जेआईआरए को इस स्तर की जानकारी जोड़ना पहला कदम है। –
उत्कृष्ट जवाब। तुरंत एक आकर्षण की तरह काम करता है। बहुत बहुत धन्यवाद। –