2016-11-29 12 views
8

मैंने पहले सवाल पूछा था कि एक वीडियो फ़ाइल के लिए एम्बेडेड यूआरएल कैसे पुनर्प्राप्त करें और सफलतापूर्वक ऐसा किया है। अब मेरे पास एक अलग मुद्दा है। एक Wunderground एपीआई वेब कैमरा प्रतिक्रिया के लिए json प्रतिक्रिया के बाद यूआरएल देता है:JSoup का उपयोग कर एंड्रॉइड में यूआरएल के भीतर एम्बेडेड यूआरएल से रिमोट वीडियो का सीधा लिंक कैसे प्राप्त करें?

https://www.wunderground.com/webcams/cadot1/902/show.html

JSoup और मेरी प्रारंभिक मुद्दे का जवाब प्रति मैं इस एम्बेडेड लिंक प्राप्त करने में सक्षम था का उपयोग करना:

https://www.wunderground.com/webcams/cadot1/902/video.html?month=11&year=2016&filename=current.mp4

उस यूआरएल से वीडियो व्यू में वीडियो को "स्ट्रीम" करने का प्रयास करते समय, मुझे "वीडियो नहीं चलाया जा सकता" त्रुटि मिल रही थी। उस लिंक के स्रोत को देखने पर मैंने देखा कि वीडियो फ़ाइल जिसे चलाने की आवश्यकता है उसे HTML में संदर्भित नहीं बल्कि जावास्क्रिप्ट में संदर्भित किया गया है। मैं वीडियो फ़ाइल के लिए सीधा लिंक कैसे प्राप्त कर सकता हूं जिसे चलाने की जरूरत है? JSoup या अन्य प्रक्रिया का उपयोग करना? //icons.wunderground.com/webcamcurrent/c/a/cadot1/902/ ":

यूआरएल:

यूआरएल https://www.wunderground.com/webcams/cadot1/902/video.html?month=11&year=2016&filename=current.mp4 के लिए स्रोत एक <script> कोष्ठक के अंदर की जरूरत वीडियो फ़ाइल के लिए निम्न से पता चलता ? current.mp4 ई = +१४८०३७७५०८ "

मैं JSoup उपयोग कर रहा हूँ इसलिए की तरह प्रतिक्रिया यूआरएल से वीडियो के लिए एम्बेडेड यूआरएल पाने के लिए:

private class VideoLink extends AsyncTask<Void, Void, Void> { 
    String title; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     mProgressDialog.setTitle("JSOUP Test"); 
     mProgressDialog.setMessage("Loading..."); 
     mProgressDialog.setIndeterminate(false); 
     mProgressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 

      // for avoiding javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name 
      System.setProperty("jsse.enableSNIExtension", "false"); 

      // WARNING: do it only if security isn't important, otherwise you have 
      // to follow this advices: http://stackoverflow.com/a/7745706/1363265 
      // Create a trust manager that does not validate certificate chains 
      TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){ 
       public X509Certificate[] getAcceptedIssuers(){return null;} 
       public void checkClientTrusted(X509Certificate[] certs, String authType){} 
       public void checkServerTrusted(X509Certificate[] certs, String authType){} 
      }}; 

      // Install the all-trusting trust manager 
      try { 
       SSLContext sc = SSLContext.getInstance("TLS"); 
       sc.init(null, trustAllCerts, new SecureRandom()); 
       HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
      } catch (Exception e) { 
       ; 
      } 

      // Connect to the web site 
      Document doc = Jsoup.connect(TEST_URL).get(); 
      Elements elements = doc.getElementsByClass("videoText"); 
      // Get the html document title 
      for (Element link : elements) { 
       String linkHref = link.attr("href"); 
       // linkHref contains something like video.html?month=11&year=2016&filename=current.mp4 
       // TODO check if linkHref ends with current.mp4 
       title = linkHref; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      mProgressDialog.dismiss(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     // Set title into TextView 
     resultTxt.setText(title); 
     String resVid = TEST_URL; 
     Log.d(TAG, "URL: " + resVid); 
     Uri resUri = Uri.parse(resVid); 
     try { 
      // Start the MediaController 
      MediaController mediacontroller = new MediaController(
        MainActivity.this); 
      mediacontroller.setAnchorView(resultVidVw); 
      // Get the URL from String VideoURL 
      Uri video = Uri.parse(resVid); 
      resultVidVw.setMediaController(mediacontroller); 
      resultVidVw.setVideoURI(video); 

     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 

     resultVidVw.requestFocus(); 
     resultVidVw.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      // Close the progress bar and play the video 
      public void onPrepared(MediaPlayer mp) { 
       mProgressDialog.dismiss(); 
       resultVidVw.start(); 
      } 
     }); 
    } 
} 

कृपया ध्यान दें कि मुझे प्रतिक्रिया सरणी में प्रत्येक JSONObject पर ऐसा करने की आवश्यकता है।

:

उत्तर

0

इस तरह आप फ़ाइल प्राप्त कर सकते हैं (सूचना: निष्कर्षण हिस्सा केवल साइट की वर्तमान एचटीएमएल के साथ काम करता है और यह है कि अगर बदलता है, यह ठीक से काम नहीं कर सकते हैं)

String url = "https://www.wunderground.com/webcams/cadot1/902/video.html"; 
int timeout = 100 * 1000; 

// Extract video URL 
Document doc = Jsoup.connect(url).timeout(timeout).get(); 
Element script = doc.getElementById("inner-content") 
     .getElementsByTag("script").last(); 
String content = script.data(); 
int indexOfUrl = content.indexOf("url"); 
int indexOfComma = content.indexOf(',', indexOfUrl); 
String videoUrl = "https:" + content.substring(indexOfUrl + 6, indexOfComma - 1); 
System.out.println(videoUrl); 

[आउटपुट: https://icons.wunderground.com/webcamcurrent/c/a/cadot1/902/current.mp4?e=1481246112]

अब आप क्रम में .ignoreContentType(true) को निर्दिष्ट org.jsoup.UnsupportedMimeTypeException से बचने के लिए कर फ़ाइल प्राप्त कर सकते हैं और .maxBodySize(0) दूर करने के लिए फ़ाइल आकार पर सीमा।

// Get video file 
byte[] video = Jsoup.connect(videoUrl) 
     .ignoreContentType(true).timeout(timeout).maxBodySize(0) 
     .execute().bodyAsBytes(); 

आप एंड्रॉयड में यह खेल सकते हैं या नहीं, लेकिन मुझे लगता है कि आप org.apache.commons.io.FileUtils का उपयोग कर इसे बचा सकते हैं अगर मैं नहीं जानता कि (मैं जावा SE में यह परीक्षण किया लेकिन नहीं एंड्रॉयड विकास के वातावरण।)

// Save video file 
org.apache.commons.io.FileUtils.writeByteArrayToFile(new File("test.mp4"), video); 
+0

भाग को सहेजना अन्य तरीकों से भी किया जा सकता है: http://stackoverflow.com/questions/4350084/byte-to-file-in-java – Omid

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

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