从 ExoPlayer 获取 403 响应代码错误

Posted

技术标签:

【中文标题】从 ExoPlayer 获取 403 响应代码错误【英文标题】:Getting a 403 response code error from ExoPlayer 【发布时间】:2018-12-29 18:11:02 【问题描述】:

我从 google DAI url 随机收到 403 错误。有时一整天都没有问题。有时会在开始播放时发生,有时会在播放几分钟后发生。这发生在直播和全屏直播上。 以下是日志:

onLoadError() called with: eventTime = [com.google.android.exoplayer2.analytics.AnalyticsListener$EventTime@c2e375b], loadEventInfo = [com.google.android.exoplayer2.source.MediaSourceEventListener$LoadEventInfo@fed7bf8], mediaLoadData = [com.google.android.exoplayer2.source.MediaSourceEventListener$MediaLoadData@db388d1], error = [com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403], wasCanceled = [false]
ExoAnalyticsLogger: onLoadStarted() called with: eventTime = [com.google.android.exoplayer2.analytics.AnalyticsListener$EventTime@bc71f36], loadEventInfo = [com.google.android.exoplayer2.source.MediaSourceEventListener$LoadEventInfo@90eee37], mediaLoadData = [com.google.android.exoplayer2.source.MediaSourceEventListener$MediaLoadData@d7a5fa4]
ExoPlayerImplInternal: Source error.
                                                                          com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
                                                                              at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:211)
                                                                              at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:147)
                                                                              at com.google.android.exoplayer2.source.hls.HlsMediaChunk.loadMedia(HlsMediaChunk.java:267)
                                                                              at com.google.android.exoplayer2.source.hls.HlsMediaChunk.load(HlsMediaChunk.java:214)
                                                                              at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:320)
                                                                              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                              at java.lang.Thread.run(Thread.java:761)
ExoAnalyticsLogger: onLoadError() called with: eventTime = [com.google.android.exoplayer2.analytics.AnalyticsListener$EventTime@65df8c2], loadEventInfo = [com.google.android.exoplayer2.source.MediaSourceEventListener$LoadEventInfo@fda36d3], mediaLoadData = [com.google.android.exoplayer2.source.MediaSourceEventListener$MediaLoadData@6cfd210], error = [com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403], wasCanceled = [false]

Encountered error
                                                                          com.google.android.exoplayer2.ExoPlaybackException
                                                                              at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:349)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:98)
                                                                              at android.os.Looper.loop(Looper.java:154)
                                                                              at android.os.HandlerThread.run(HandlerThread.java:61)
                                                                           Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
                                                                              at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:211)
                                                                              at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:147)
                                                                              at com.google.android.exoplayer2.source.hls.HlsMediaChunk.loadMedia(HlsMediaChunk.java:267)
                                                                              at com.google.android.exoplayer2.source.hls.HlsMediaChunk.load(HlsMediaChunk.java:214)
                                                                              at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:320)
                                                                              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                              at java.lang.Thread.run(Thread.java:761)

【问题讨论】:

【参考方案1】:

根据此thread,cookie 处理程序/管理器可能存在问题。确保您在 okhttp 服务类和 exo 播放器活动中使用相同的 CookieHandler。您也可以查看此link 以获取更多参考。

【讨论】:

我根本没有使用 cookie 处理程序,服务器的 url 也没有使用 cookie 发送,我什至尝试使用与评论中提到的相同示例的 cookie 处理程序,它没有t 解决问题,我得到了空值。其次,作为你提到的例子,我的问题是不同的,在这种情况下,我的直播连续运行了几个小时,甚至几天,但突然它显示了这个异常,当我重新启动它时,它开始像往常一样工作。 这方面有什么更新吗?我也被这个 403 问题困扰。我正在尝试播放 HLS 直播频道。 HD 频道可以正常播放,但 SD 频道播放 1 分钟,然后卡住并出现 403 错误。 这有什么更新吗?我也有同样的问题。会播放 10 秒,然后在尝试提高比特率时冻结。 这有什么更新吗?我也有同样的问题响应码 403【参考方案2】:

查看this 关于存储 cookie 的线程。假设您使用 Akamai url 进行流式传输,该解决方案为我解决了 403 问题。

注意你需要实现

com.squareup.okhttp3:okhttp-urlconnection:4.6.0 com.google.android.exoplayer:extension-okhttp:2.11.4

获取 JavaNetCookieJar 和 OkHttpDataSourceFactory。

【讨论】:

以上是关于从 ExoPlayer 获取 403 响应代码错误的主要内容,如果未能解决你的问题,请参考以下文章

获取带有 AJAX 错误的服务器响应?

javascript fetch 响应 403 错误

如何在 HTTP 403 响应中获取自定义错误响应文本

当我使用谷歌你管 API 获取搜索结果时,它给出 403 错误

如何使用 Exoplayer 播放从 Mediastore 获取的视频

在 android 中获取意外的响应代码 403,同时在谷歌云控制台中将 API 密钥限制为 Android 应用程序