最近在做视频采集相关的软件,需要获得在线视频播放的真正地址。由于每家视频的对外api不一样,而且每家视频的获取方式都不一样,给获取主流视频网站的真正地址带来了一定的麻烦。
随着移动互联网的发展,HTML5技术的迅速普及,现在主流在线视频播放网站都支持HTML5点播技术。而且这些视频网站必须遵循HTML5的规范,这就统一了,不会写一种方式,然后用在其他的视频网站又不能工作。
支持HTML5视频的页面都会有一个video标签的。
video标签的规范如下
属性 | 值 | 描述 |
---|---|---|
autoplay | autoplay | 如果出现该属性,则视频在就绪后马上播放。 |
controls | controls | 如果出现该属性,则向用户显示控件,比如播放按钮。 |
height | pixels | 设置视频播放器的高度。 |
loop | loop | 如果出现该属性,则当媒介文件完成播放后再次开始播放。 |
muted | muted | 规定视频的音频输出应该被静音。 |
poster | URL | 规定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像。 |
preload | preload | 如果出现该属性,则视频在页面加载时进行加载,并预备播放。 如果使用 "autoplay",则忽略该属性。 |
src | url | 要播放的视频的 URL。 |
width | pixels | 设置视频播放器的宽度。 |
@来自互联网
实现思路:
通过Android的webview载入页面,
页面载入完毕后,执行javascript代码,通过javascript代码调用Android本地代码即可。
Android本地java执行javascript代码可以直接通过webview的loadurl方法执行。
view.loadUrl("javascript:window.js_method.showSource(document.getElementsByTagName('video')[0].src);"); // iqiyi
javascript调用Android本地java代码主要通过WebView.addJavascriptInterface();方法
mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "js_method");//添加java script接口
具体实现过程如下
private void getPlayUriFromHtml5() { // mWebView.getSettings() // .setUserAgentString( // "Android Mozilla/5.0 AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"); // http://code.google.com/p/mofmof-js/wiki/UserAgentStrings Log.i(TAG, "getPlayUriFromHtml5"); WebView mWebView; mWebView = new WebView(this); initSettings(mWebView); mWebView.getSettings() .setUserAgentString( "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"); mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "js_method");//添加java script接口 mWebView.loadUrl(playUriTemp); } @SuppressLint("SetJavaScriptEnabled") private void initSettings(WebView mWebView) { WebSettings webSettings = mWebView.getSettings(); //开启java script的支持 webSettings.setJavaScriptEnabled(true); // 启用localStorage 和 essionStorage webSettings.setDomStorageEnabled(true); // 开启应用程序缓存 webSettings.setAppCacheEnabled(true); String appCacheDir = this.getApplicationContext() .getDir("cache", Context.MODE_PRIVATE).getPath(); webSettings.setAppCachePath(appCacheDir); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setAppCacheMaxSize(1024 * 1024 * 10);// 设置缓冲大小,我设的是10M webSettings.setAllowFileAccess(true); mWebView.setWebViewClient(mWebViewClient); } private WebViewClient mWebViewClient = new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { view.loadUrl("javascript:window.js_method.showSource(document.getElementsByTagName('video')[0].src);"); // iqiyi // view.loadUrl("javascript:window.js_method.showSource('<head>'+" + // "document.getElementsByTagName('html')[0].innerHTML+'</head>');"); super.onPageFinished(view, url); } }; class InJavaScriptLocalObj { public void showSource(String html5url) { if (html5url != null && !GETHTML5_COMPLETE) { GETHTML5_COMPLETE = true; realPlayUrl = html5url; mEventHandler.sendEmptyMessage(GET_REALPLAYURL_COMPLETE); } Log.i("conowen", "html5url=" + html5url); } }
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
mWebView.getSettings() .setUserAgentString( "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");