2016-11-29 3 views
8

Ich hatte zuvor die Frage gestellt, wie man die eingebettete URL für eine Videodatei abruft und erfolgreich ausgeführt hat. Jetzt habe ich ein anderes Problem. Die JSON-Antwort für eine Wunderground API Webcam Antwort gibt die folgende URL:Wie erhalten Sie direkte Verbindung von Remote-Video von eingebetteten URL in einer URL in Android mit JSoup?

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

Mit JSoup und je die Antwort auf meine erste Frage ich in der Lage war, diese eingebetteten Link zu erhalten:

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

Beim Versuch, das Video von dieser URL zu einem VideoView zu "streamen", habe ich immer den Fehler "Video kann nicht abgespielt werden" erhalten. Beim Betrachten der Quelle für diesen Link habe ich festgestellt, dass die Videodatei, die abgespielt werden muss, nicht in html, sondern in Javascript referenziert wird. Wie kann ich den direkten Link für die Videodatei erhalten, die abgespielt werden muss? JSoup oder einen anderen Prozess verwenden?

Die Quelle für die URL https://www.wunderground.com/webcams/cadot1/902/video.html?month=11&year=2016&filename=current.mp4 zeigt die folgende für die benötigte Videodatei innerhalb einer <script> Klammer:

url: „//icons.wunderground.com/webcamcurrent/c/a/cadot1/902/ ? current.mp4 e = 1480377508"

ich JSoup bin mit dem eingebetteten uRL für das Video aus der Antwort-uRL zu erhalten, wie so:

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(); 
      } 
     }); 
    } 
} 

Bitte beachten Sie, dass ich dies für jedes JSONObject im Antwort-Array tun muss.

Antwort

0

Dies ist, wie Sie die Datei erhalten können:

(Hinweis: die Extraktion Teil funktioniert nur mit aktuellen HTML-Code der Seite und wenn sich das ändert, kann es nicht korrekt funktionieren)

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); 

[Ausgabe: https://icons.wunderground.com/webcamcurrent/c/a/cadot1/902/current.mp4?e=1481246112]

Jetzt können Sie die Datei erhalten, indem .ignoreContentType(true) um die Angabe org.jsoup.UnsupportedMimeTypeException zu vermeiden und .maxBodySize(0) die entfernen Begrenzung der Dateigröße.

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

Ich weiß nicht, ob Sie es in Android spielen kann oder nicht, aber ich glaube, Sie es org.apache.commons.io.FileUtils mit speichern kann (ich es in Java SE getestet, aber nicht Android-Entwicklungsumgebung.)

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

Das Speichern von Teilen kann auch auf andere Arten erfolgen: http://StackOverflow.com/questions/4350084/byte-to-file-in-java – Omid

Verwandte Themen