如何使用JSoup在Android中的url中的embedded式url的远程video直接链接?

我曾经问过如何检索video文件的embedded式url的问题,并已成功完成。 现在我有一个不同的问题。 针对WUnderground APInetworking摄像机响应的json响应提供以下url:

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

使用JSoup,并根据我最初的问题的答案,我能够得到这个embedded式的链接:

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

在尝试将video从该url“stream式传输”到VideoView时,我不断收到错误“无法播放video”。 在查看该链接的源代码后,我注意到需要播放的video文件不是在html中引用,而是JavaScript。 如何获得需要播放的video文件的直接链接? 使用JSoup或其他进程?

url https://www.wunderground.com/webcams/cadot1/902/video.html?month=11&year=2016&filename=current.mp4的源代码在<script>括号内显示了以下所需的video文件:

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

我正在使用JSoup从响应url中获取video的embedded式url,如下所示:

  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上执行此操作。

Solutions Collecting From Web of "如何使用JSoup在Android中的url中的embedded式url的远程video直接链接?"

这是如何获取文件:

注意 :提取部分只能与当前网站的html一起工作,如果改变,它可能无法正常工作!)

 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=1481246112https://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(); 

我不知道你是否可以在Android中播放它,但我认为你可以使用org.apache.commons.io.FileUtils (我在Java SE中testing过,但不是在Android开发环境中testing过)。

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