获取优酷(youku),土豆(tudou),乐视(letv),爱奇艺(iqiyi)等HTML5页面上的视频真正地址

http://blog.csdn.net/conowen/article/details/24027401

/********************************************************************************************
 * author:conowen@大钟                                                                                                                          
 * E-mail:conowen@hotmail.com                                                                                                             
 * http://blog.csdn.net/conowen                                                                                                              
 * 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。      

 ********************************************************************************************/





      最近在做视频采集相关的软件,需要获得在线视频播放的真正地址。由于每家视频的对外api不一样,而且每家视频的获取方式都不一样,给获取主流视频网站的真正地址带来了一定的麻烦。


      随着移动互联网的发展,HTML5技术的迅速普及,现在主流在线视频播放网站都支持Html5点播技术。而且这些视频网站必须遵循HTML5的规范,这就统一了,不会写一种方式,然后用在其他的视频网站又不能工作。

支持HTML5视频的页面都会有一个video标签的。

video标签的规范如下

属性

属性描述
autoplayautoplay如果出现该属性,则视频在就绪后马上播放。
controlscontrols如果出现该属性,则向用户显示控件,比如播放按钮。
heightpixels设置视频播放器的高度。
looploop如果出现该属性,则当媒介文件完成播放后再次开始播放。
mutedmuted规定视频的音频输出应该被静音。
posterURL规定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像。
preloadpreload

如果出现该属性,则视频在页面加载时进行加载,并预备播放。

如果使用 "autoplay",则忽略该属性。

srcurl要播放的视频的 URL。
widthpixels设置视频播放器的宽度。

@来自互联网


实现思路:

通过Android的webview载入页面,

页面载入完毕后,执行JavaScript代码,通过javascript代码调用Android本地代码即可。

Android本地Java执行javascript代码可以直接通过webview的loadurl方法执行。

[javascript]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. view.loadUrl("javascript:window.js_method.showSource(document.getElementsByTagName('video')[0].src);"); // iqiyi  


javascript调用Android本地java代码主要通过WebView.addJavascriptInterface();方法


[javascript]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "js_method");//添加java script接口  


具体实现过程如下


[javascript]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private void getPlayUriFromHtml5() {  
  2.   
  3.         // mWebView.getSettings()  
  4.         // .setUserAgentString(  
  5.         // "Android Mozilla/5.0 AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30");  
  6.         // http://code.google.com/p/mofmof-js/wiki/UserAgentStrings  
  7.         Log.i(TAG, "getPlayUriFromHtml5");  
  8.         WebView mWebView;  
  9.         mWebView = new WebView(this);  
  10.         initSettings(mWebView);  
  11.         mWebView.getSettings()  
  12.                 .setUserAgentString(  
  13.                         "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D5145e Safari/9537.53");  
  14.   
  15.         mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "js_method");//添加java script接口  
  16.         mWebView.loadUrl(playUriTemp);  
  17.     }  
  18.   
  19.     @SuppressLint("SetJavaScriptEnabled")  
  20.     private void initSettings(WebView mWebView) {  
  21.   
  22.         WebSettings webSettings = mWebView.getSettings();  
  23.         //开启java script的支持  
  24.         webSettings.setJavaScriptEnabled(true);  
  25.   
  26.         // 启用localStorage 和 essionStorage  
  27.         webSettings.setDomStorageEnabled(true);  
  28.   
  29.         // 开启应用程序缓存  
  30.         webSettings.setAppCacheEnabled(true);  
  31.         String appCacheDir = this.getApplicationContext()  
  32.                 .getDir("cache", Context.MODE_PRIVATE).getPath();  
  33.         webSettings.setAppCachePath(appCacheDir);  
  34.         webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);  
  35.         webSettings.setAppCacheMaxSize(1024 * 1024 * 10);// 设置缓冲大小,我设的是10M  
  36.         webSettings.setAllowFileAccess(true);  
  37.   
  38.         mWebView.setWebViewClient(mWebViewClient);  
  39.     }  
  40.   
  41.     private WebViewClient mWebViewClient = new WebViewClient() {  
  42.   
  43.         @Override  
  44.         public void onPageFinished(WebView view, String url) {  
  45.             view.loadUrl("javascript:window.js_method.showSource(document.getElementsByTagName('video')[0].src);"); // iqiyi  
  46.             // view.loadUrl("javascript:window.js_method.showSource('<head>'+" +  
  47.             // "document.getElementsByTagName('html')[0].innerHTML+'</head>');");  
  48.             super.onPageFinished(view, url);  
  49.         }  
  50.   
  51.     };  
  52.   
  53.     class InJavaScriptLocalObj {  
  54.         public void showSource(String html5url) {  
  55.             if (html5url != null && !GETHTML5_COMPLETE) {  
  56.                 GETHTML5_COMPLETE = true;  
  57.                 realPlayUrl = html5url;  
  58.                 mEventHandler.sendEmptyMessage(GET_REALPLAYURL_COMPLETE);  
  59.             }  
  60.             Log.i("conowen""html5url=" + html5url);  
  61.         }  
  62.     }  

网页加载完毕之后,就可以直接输出HTML5的真正播放地址了。

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. 04-18 17:09:39.855: I/conowen(5545): http://pl.youku.com/playlist/m3u8?vid=174867986&type=mp4&ts=1397812170&keyframe=0&ep=ciGdHUGMVM8G7CLbij8bNiWzdiEHXP8N8heDhttqBtQnTey8&sid=039781216914212a9a2f8&token=3543&ctype=12&ev=1&oip=1876824509  

需要注意一点的就是。浏览器的UserAgent一定要设置为移动端的浏览器ua,如iphone的,这样才可以伪装,让页面显示出HTML5的video标签。

[javascript]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. mWebView.getSettings()  
  2.                 .setUserAgentString(  
  3.                         "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D5145e Safari/9537.53");  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值