Wie man den direkten link von remote-video von embedded-url in ein url in Android mit JSoup?

Ich hatte die Frage bereits über die zum abrufen des eingebetteten url für ein video-Datei und erfolgreich getan. Jetzt habe ich ein anderes Problem. Die json-Antwort für ein WUnderground-API-webcam Antwort gibt die folgende url:

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

Mit JSoup und pro die Antwort auf meine erste Frage, die ich war in der Lage, diese eingebetteten link:

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

Beim Versuch zu „streamen“ das video aus, dass die url zu einer VideoView, ich habe immer den Fehler „cannot play video“. Beim Blick auf die Quelle für diesen link ich habe bemerkt, dass die video-Datei, die gespielt werden muss, ist nicht auf die in html, sondern javascript. Wie bekomme ich den direkten link für die video-Datei, die gespielt werden muss? Mit JSoup oder anderen Verfahren?

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ötigten video-Datei innerhalb einer <script> Halterung:

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

Ich bin mit JSoup zu Holen Sie sich die embedded-url für das video von der Antwort, die url etwa 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 das tun müssen, auf jeden JSONObject in das response-array.

InformationsquelleAutor Steve C. | 2016-11-29



One Reply
  1. 0

    Dieser ist, wie kann man die Datei:

    (Bemerken: die Extraktion Teil funktioniert nur mit den aktuellen html-Code der Seite und wenn 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]

    Nun können Sie die Datei, indem Sie .ignoreContentType(true) um zu vermeiden, dass org.jsoup.UnsupportedMimeTypeException und .maxBodySize(0) zu entfernen, die Begrenzung auf Datei Größe.

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

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

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.