2012-08-17 3 views
3

Android Webview에서 일부 YouTube 동영상을 재생할 때 많은 문제가 발생합니다. 나는 사방을 검색하지만 작동하는 해결책을 찾을 수 없습니다. http://www.youtube.com/watch?v=JEkbk-xDmZEAndroid Webview의 YouTube 라이브 스트림이 흔들림입니다.

소리가 큰하지만 비디오는 1 프레임처럼 매우 느립니다 :

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", ""); 

문제는이 같은 특정 스트림을 것 같다 :

나는 다음과 같은 코드를 사용하고 초당. unwatchable.

하지만이 스트림에 사용하는 경우 : http://www.youtube.com/watch?v=GDFIYKmNw9Q

을 그것은 완벽하게 잘 작동합니다.

이 라이브 스트림의 차이점은 무엇이며 처음 재생을 제대로하려면 어떻게해야합니까? 또한 첫 번째 경우가 제대로 작동한다고 언급해야합니다. 나는 때때로 그것이 연극과 다른 시간이 아닌 이유를 이해할 수 없다. 거의 영향을 미치지 않을 수도있는 설정을 제거하기 위해 Webview 및 Factory Reset 장치를 사용하여 새 프로젝트를 만들려고했지만 여전히 문제가 발생합니다.

+0

문제 해결에 도움이 되었습니까? – edwin

답변

7

저는 YouTube와 일반적으로 안드로이드에서 작동하도록 노력했습니다. 왜 어떤 비디오 지연이 저를 넘어서는가요? 그러나 품질 설정과 대역폭 제한으로 인해 버퍼링이 다를 수 있습니다.

버퍼링 문제가 아니라면 아래 옵션 중 하나가 도움이되기를 바랍니다.

현재 WebView에서는 IFrame 또는 YouTube API를 사용합니다. 그렇지 않으면 GData API를 사용하여 VideoView에서 사용할 비디오에 대한 RSTP 링크를 가져올 수 있습니다. 마지막으로 인 텐트를 사용하여 YouTube 앱을 시작할 수 있습니다.

미래에 YouTube 용 Android 용 새 API가 있습니다. 그러나 그것은 공개되지 않았습니다. http://www.youtube.com/watch?v=3WFsx-u-q3Y

프로/아래 단점

웹보기 (예를 들면 모든 웹보기 화면의 높이와 너비의 100 %를 채울하고 있습니다) - - IFrame을 테마 다시도 십이 2011 년에 발표 된 Google지도에 대한 조각의 지원을하고있다 - 제한적인 구성이 가능합니다. WebView에서 실행되며 거의 모든 플랫폼에서 작동합니다. 나쁘게 지내지 마십시오. 때로는 다른 옵션이 작동하지 않고 비디오를 재생하려고 할 때 회색 배경이 나타납니다. 다음 사이트를 사용하여 IFrame 코드를 만들고 다른 옵션을 시도해보십시오 (예 : https://developers.google.com/youtube/youtube_player_demo). 숨기기 컨트롤이 적용되지 않는 등 몇 가지 허용되는 구성 옵션이 작동하지 않습니다. 언급했듯이 많은 다른 옵션이 있으므로 시행 착오가 수반됩니다. 몇몇은 작동하지 않지만 일부는 상당히 달라 보입니다. 귀하의 질문을 보면, 전에 html5 = 1 옵션을 사용하지 않았거나 youtube.com을 기본 URL로 설정했습니다.

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"); 

웹보기 - 유튜브 API - 훨씬 더 나은,하지만 플래시가 필요합니다. 따라서 "Nexus 7"및 JellyBean (4.1 이상)과 함께 출시되는 향후 기기는 작동하지 않습니다. 이러한 장치의 WebView는 WebBrowser의 축소 버전이 아닌 축소 된 버전의 Chrome을 사용합니다. 따라서 어제 알게 되니 앞으로는이 앱을 우리 앱에 사용할 수 없습니다.

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"); 

VideoView를 지켜 보면서 - 유튜브 데이터 API - 한 VideoView를 지켜 보면서에서 사용하기 위해 비디오 스트림에 대한 정보와 중요한 링크에 액세스 할 수 있습니다. 다시 말하지만 무료 API는 MP4 (고화질/HD) 스트림이 아닌 낮은 quaility 3GP 비디오로 제한됩니다. - 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; 
    } 
} 
+1

Nexus 7에서 우리는 깨진 영화 릴의 흰색 이미지가있는 회색 스크린을 얻고있었습니다. 'webView.setWebChromeClient (new WebChromeClient());'문제가 수정되었습니다. 덕분에 – christophercotton

+0

나는 그것을 시도했지만 그것은 절대 도움이 될 것이라고 확신합니다. 안드로이드 클라이언트에서 다음 번에 다시 그것을해야한다. 건배 – JonWillis

+0

또한 'youtube.com/v /'대신'flash '대신 HTML5를 사용하기 때문에'youtbue.com/embed/'를 사용하고 있습니다. – christophercotton

관련 문제