YouTubeAndroidPlayerAPI 无法播放某些视频

Posted

技术标签:

【中文标题】YouTubeAndroidPlayerAPI 无法播放某些视频【英文标题】:YouTubeAndroidPlayerAPI can't play some videos 【发布时间】:2016-09-03 02:18:03 【问题描述】:

-- 更新 09/05/2016 17:10 -- 问题似乎与视频的发布日期有关……在 4 月的最后一周,我在 YouTube 上发布了许多视频,4 月 27 日 19:00 之前发布的视频正常工作,而 21:15 之前在 YouTube 上收费的视频同一天讨论了这个问题,好像在 4 月 27 日 19 日至 21 日之间,YouTube 对视频进行了一些更新或更改。我现在尝试加载一个新视频,这也有同样的问题。


我在使用 YouTubeandroidPlayerAPI 时遇到了一个奇怪的问题。我使用 YouTubePlayerSupportFragment(但我对 YouTubePlayerFragment 也有同样的问题)在我的应用中播放视频,一些视频播放完美,其他显示错误“播放时出现问题。点按重试。”。

在 Android 监视器中发生这种情况时,我看到 YouTube API 错误:

05-08 11:25:22.145 20521-20521/? E/YouTubeAndroidPlayerAPI: fmt.noneavailable
oae: Video not supported/available
at oab.a(SourceFile:212)
at nvl.a(SourceFile:383)
at nvl.a(SourceFile:706)
at nvr.a(SourceFile:1144
at nsn.onPostExecute(SourceFile:2102)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

如果我点击视频中的 YouTube 图标在 YouTube 应用中播放,则视频在官方应用中可以正常播放。

如果视频启用了获利功能,则广告视频会正常显示,最后会显示错误。

我试过了:

使用 YouTubePlayerFragment 代替 YouTubePlayerSupportFragment 使用 Activity 而不是 AppCompatActivity 将视频嵌入到 html 页面中,它可以正常工作 停用获利功能,没有任何变化 不同的密钥,一个用于调试,一个用于发布

非常感谢您的帮助!


2016 年 11 月 5 日更新 这似乎是一个 YouTube 错误;目前唯一可行的解​​决方法似乎是在 YouTube 官方应用程序中有意打开视频或将播放器片段替换为 WebView。标准的 WebView 非常有限,不会显示使视频全屏显示的按钮。 您需要创建一个扩展 WebChromeClient 的类:

public class MyWebChromeClient extends WebChromeClient 

    FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);

    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) 
        if (mCustomView != null) 
            callback.onCustomViewHidden();
            return;
        
        mContentView = (LinearLayout) findViewById(R.id.scheda_video_activity);
        mContentView.setVisibility(View.GONE);
        mCustomViewContainer = new FrameLayout(SchedaVideoActivity.this);
        mCustomViewContainer.setLayoutParams(LayoutParameters);
        mCustomViewContainer.setBackgroundResource(android.R.color.black);
        view.setLayoutParams(LayoutParameters);
        mCustomViewContainer.addView(view);
        mCustomView = view;
        mCustomViewCallback = callback;
        mCustomViewContainer.setVisibility(View.VISIBLE);
        setContentView(mCustomViewContainer);
    

    @Override
    public void onHideCustomView() 
        if (mCustomView == null) 
            return;
         else 
            mCustomView.setVisibility(View.GONE);
            mCustomViewContainer.removeView(mCustomView);
            mCustomView = null;
            mCustomViewContainer.setVisibility(View.GONE);
            mCustomViewCallback.onCustomViewHidden();
            mContentView.setVisibility(View.VISIBLE);
            setContentView(mContentView);
        
    

然后初始化WebView:

WebView myWebView = (WebView)findViewById(R.id.webview);
MyWebChromeClient mWebChromeClient = new MyWebChromeClient();
myWebView.setWebChromeClient(mWebChromeClient);
myWebView.setWebViewClient(new WebViewClient()
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
        return false;
    
);
WebSettings webSettings = myWebView.getSettings();
webSettings.setjavascriptEnabled(true);

最后,在 WebView 中加载视频:

myWebView.loadUrl("https://www.youtube.com/embed/"+youtube_id);

如果您想调整 WebView 尺寸以适应 YouTube 播放器,您可以这样做:

Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
myWebView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int)Math.round(size.x/1.77)));

【问题讨论】:

一些更新:我已将 YouTube 应用降级到版本 11.10.60(请参阅下面的答案),但问题仍然存在;所以我降级到 tge 工厂版本,10.28.60 并且我看不到任何视频,我收到错误 DEVELOPER_KEY_INVALID。 我不知道它是否有帮助,但我只有在最近上传到 Youtube 上的视频时才会遇到这个问题。也许最近的格式更改会导致这种情况? 是的,问题似乎与视频的发布日期有关...在 4 月的最后一周,我在 YouTube 上发布了许多视频,4 月 27 日 19:00 之前发布的视频正常运行,虽然在同一天 21:15 之前被指控的人已经讨论了这个问题,但好像在 4 月 27 日 19 日至 21 日期间,YouTube 对视频进行了一些更新或更改。我现在尝试加载一个新视频,这也有同样的问题。 @frabbe 使用 finishOnEnd = false 播放视频会起作用..但问题是当播放停止时用户将留在 YT 应用程序中。我希望它是一个临时问题,另一方面我也在考虑一些临时解决方案(在对话框片段或其他东西中包装嵌入 html)。应用程序更新将比从 YT 修复更快。 @bajicdusko 是的,创建一个实现YouTubePlayer.PlayerStateChangeListener 的类并将其发送给玩家player.setPlayerStateChangeListener(myPlayerStateChangeListener);onError 函数在这种情况下返回INTERNAL_ERROR 是可能的。但这并不能解决问题,因为我可以从这里启动 YouTube 应用程序,但是当我在观看视频后返回我的应用程序时 youtube 片段,只有在暂停时,再次播放触发错误等等,无限循环。它按照您的建议,更好地集成 WebView。 【参考方案1】:

尝试将您的 YouTube 应用更新到版本 11.19.56。

【讨论】:

以上是关于YouTubeAndroidPlayerAPI 无法播放某些视频的主要内容,如果未能解决你的问题,请参考以下文章

使用 YoutubeAndroidPlayerAPI 中的 YoutubePlayerView 播放私人 YouTube 视频?

Nexus Player (Android TV) YouTubeAndroidPlayerApi 错误:“初始化 YouTube 播放器时出错。”

Xamarin + Android + Binding YouTube 视频播放器编译错误

YouTube Android Player API无法在xiaomi Redmi Note 3中使用

无需 youtube 应用即可将 Youtube 视频集成到应用中

警告:项目应用程序:仅支持 Jar 类型的本地依赖项