Android Webview中的Youtube直播流是紧张不安的

swe*_*y84 3 youtube flash android webview

我在尝试在Android Webview中播放一些YouTube视频时遇到了很多麻烦.我到处搜索,但找不到有效的解决方案.

我使用以下代码:

WebView mWebView = (WebView) findViewById(R.id.webView1);
//Setup Webview
WebChromeClient client= new WebChromeClient();
mWebView.setWebChromeClient(client);

mWebView.getSettings().setPluginsEnabled(true);
mWebView.getSettings().setSupportZoom(false);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);
mWebView.getSettings().setAllowFileAccess(true);

mWebView.loadDataWithBaseURL("www.youtube.com", "<iframe class=\"youtube-player\" type=\"text/html\" width=\"640\" height=\"385\" src=\"http://www.youtube.com/embed/JEkbk-xDmZE?html5=1\" frameborder=\"0\">\n</iframe>", "text/html", "UTF-8", "");
Run Code Online (Sandbox Code Playgroud)

这个问题似乎只适用于像这样的某些流:http://www.youtube.com/watch?v = JEkbk-xDmZE

声音很棒,但视频很慢,比如每秒1帧.不可观看.

但如果我使用此流:http://www.youtube.com/watch?v = GDFIYKmNw9Q

它工作得很好.

这些直播流有什么区别,我如何让第一个正常播放?另外我应该提一下,有时候第一个玩得很好.我无法弄清楚为什么它有时会播放而其他时候却没有.我尝试创建一个新项目,几乎只是一个Webview和一个Factory Reset设备,以消除可能影响这个的任何设置,但我仍然遇到问题.

Jon*_*lis 7

我一直在与YouTube斗争,试图让它在Android上工作.为什么某些视频滞后超出了我,但它可能是不同的质量设置和有限的带宽因此它的缓冲.

希望下面的选项之一可能有所帮助,如果它不是缓冲问题.

目前,使用WebView,您可以使用IFrame或YouTube API.否则,您可以使用GData API获取视频的RSTP链接,以便在VideoView中使用.最后,您可以使用Intent启动YouTube应用.

将来有一个适用于Android的Android新API.但它尚未发布.主题再次没有片段支持2011年12月宣布的谷歌地图. - http://www.youtube.com/watch?v=3WFsx-u-q3Y

下面的优点/缺点(示例都是使WebView填充100%的屏幕高度和宽度)

WebView - IFrame - 可用的有限配置.在WebView中运行,几乎适用于所有平台.不要误会我的意思,有时不同的选项不起作用,当你尝试播放视频时,你会得到一个灰色的背景.使用以下网站创建IFrame代码并尝试不同的选项,直到它适合您 - https://developers.google.com/youtube/youtube_player_demo(请注意几个允许的配置选项不起作用,例如隐藏控件具有没有效果).如上所述,有许多不同的选项,因此涉及试验和错误.虽然有些不起作用,但有些看起来很不一样.看看你的问题,我以前从未使用过html5 = 1选项,或者将youtube.com设置为基本网址.

webView = new WebView(this);
webView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.getSettings().setJavaScriptEnabled(true);

// Prevent scrolling of the webview
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.setHorizontalScrollBarEnabled(false);
webView.setVerticalScrollBarEnabled(false);
webView.setWebChromeClient(new WebChromeClient()); //Blank webview to prevent null pointer plugin issues
webView.setWebViewClient(new WebViewClient()
{
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
        view.loadUrl(url);
        return true;
    }
});

String data = "<html>"+
"<head>"+
"</head>"+
"<body style=\"margin: 0; padding: 0\">"+
"<iframe " +
"type=\"text/html\" "+
"class=\"youtube-player\" "+
"width=\"100%25\" "+
"height=\"100%25\" "+
"src=\"http://www.youtube.com/v/" + uri +
"?controls=0&showinfo=0&showsearch=0&modestbranding=1&fs=0\" "+
"frameborder=\"0\"></iframe>" +
"</body>"+
"</html>";

webView.loadData(data, "text/html", "utf-8");
Run Code Online (Sandbox Code Playgroud)

WebView - YouTube API - 好多了,但需要闪存.因此,"Nexus 7"以及随JellyBean(4.1及更高版本)发布的任何未来设备将无效.由于这些设备上的WebView使用的是Chrome的缩减版本,而不是WebBrowser的缩减版本.因此,正如我昨天发现的那样,未来我们的应用程序无法使用它.

webView = new WebView(this);
webView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.getSettings().setJavaScriptEnabled(true);

// Prevent scrolling of the webview
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.setHorizontalScrollBarEnabled(false);
webView.setVerticalScrollBarEnabled(false);
webView.setWebChromeClient(new WebChromeClient()); //Blank webview to prevent null pointer plugin issues
webView.setWebViewClient(new WebViewClient()
{
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
        view.loadUrl(url);
        return true;
    }
});

String data = "<!DOCTYPE HTML>" + "<html>" + "<body style=\"margin: 0; padding: 0\">"
+ "<div id=\"player\"></div>"
+ "<script>"
+
// Load player api asynchronously.
"var tag = document.createElement('script');" + "tag.src = \"http://www.youtube.com/player_api\";"
        + "var firstScriptTag = document.getElementsByTagName('script')[0];" + "firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);"
        + "var done = false;" + "var player;" + "function onYouTubePlayerAPIReady() {" + "player = new YT.Player('player', {" + "height: '100%25',"
        + "width: '100%25'," + "videoId: '"
        + uri
        + "',"
        + "playerVars: { 'controls': "
        + controls
        + ", 'showinfo': 0, 'fs':0, 'modestbranding':1 },"
        + "events: {"
        + "'onReady': onPlayerReady," + "'onStateChange': onPlayerStateChange" + "}" + "});" + "}" + "function onPlayerReady(evt) {" +
        // Autoplay
        "evt.target.playVideo();" + "}" + "function onPlayerStateChange(evt) {" +
        "}" + "function stopVideo() {" + "player.stopVideo();" + "}" + "</script>" + "</body>" + "</html>";

webView.loadData(data, "text/html", "utf-8");
Run Code Online (Sandbox Code Playgroud)

VideoView - YouTube数据API - 可以访问信息,重要的是链接到视频流,以便在VideoView中使用.缺点是免费API仅限于低质量3GP视频,而不是MP4(高质量/高清)流.- https://developers.google.com/youtube/getting_started#data_api

意图 - 启动YouTube - 使用您要播放的视频打开YouTube应用.缺点是另一个应用程序已打开,因此未嵌入到您的应用程序中,并且某些设备未安装YouTube.

if (AppChecker.isAppInstalled("com.google.android.youtube", this) == true)
{
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + uri));
    startActivity(intent);
}
else
{
    //Show youtube not installed
}

//Code to check if YouTube is installed.

public class AppChecker
{
    public static boolean isAppInstalled(String uri, Activity activity)
    {
        PackageManager pm = activity.getApplicationContext().getPackageManager();
        boolean app_installed = false;
        try
        {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            app_installed = true;
        }
        catch (PackageManager.NameNotFoundException e)
        {
            app_installed = false;
        }
        return app_installed;
    }
}
Run Code Online (Sandbox Code Playgroud)