Android中的ExoPlayer未使用M3U8+QueryParameter(auth)加载



我使用的是com.google.android.exterlayer2(exoPlayerVersion='r2.5.2'(,我必须加载/流式传输等视频

> https://something.com/test/something.m3u8

它运行得很好。

但要求发生了变化,并据此改变了视频的URL格式,在URL的查询参数中添加了一些与认证相关的部分。

> https://something.com/test/something.m3u8?media-auth=exp=1623782763942~acl=/test/7dede44-djnjcndncj/*~hmac=3232434242

现在播放器没有加载此视频。

错误日志显示此错误。

2021-05-06 08:42:12.395 7020-7220/?E/ExoPlayerImplInternal:源错误。com.google.android.explorer2.upstream.HttpDataSource$InvalidResponseCodeException:响应代码:403网址:com.google.android.explorer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:211(网址:com.google.android.explorer2.upstream.DefaultDataSource.open(DefaultDataSource.java:141(网址:com.google.android.explorer2.upstream.DataSourceInputStream.checkOpened(DataSourceInputStream.java:102(网址:com.google.android.explorer2.upstream.DataSourceInputStream.open(DataSourceInputStream.java:65(网址:com.google.android.explorer2.upstream.PassingLoadable.load(ParsingLoadable.java:125(网址:com.google.android.explorer2.upstream.Loader$LoadTask.run(Loader.java:315(位于java.util.concurrent.ThreadPoolExecutiator.runWorker(ThreadPoolExecutiator.java:1167(位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641(在java.lang.Thread.run(线程.java:764(2021-05-06 08:42:12.396 7020-7020/?E/VideoPlayerView:onError

HlsSource sourceHLS = new HlsSource(videoQuiz.video.id(),
videoQuiz.video.title(),
VideoHelper.prepareHlsVideoUriWithQuery("video URL"),
HlsSource.TIME_UNSET,
0,
HlsSource.TIME_UNSET,
0L, null);
videoPlayerView.start(sourceHLS,
toUri(thumbnailUrl),
autoPlay,
getCurrentSegmentStartPosition());
showQuestionAt(currentQuestionPosition);

下面我提到了我是如何改变";prepareHlsVideoUriWithQuery";方法

public static Uri prepareHlsVideoUriWithQuery(String thisUrl) {
URL url = null;
try {
url = new URL("video URL");
} catch (MalformedURLException e) {
e.printStackTrace();
}
Uri.Builder builder = new Uri.Builder()
.scheme(url.getProtocol())
.encodedAuthority(url.getAuthority())
.encodedPath(url.getPath().substring(1))
.encodedQuery("video-auth=exp=24244~test=/test/232323-3232323/*~test=24242c0232n3223");
return builder.build();
}

那么,我必须更改哪个位置才能在exo播放器中加载m3u8+authstring?

和任何关于设置mimetype的想法在这里描述Android HLS视频mimetype

我可以找到一个解决方案,

初始化类时,我添加了

private static final CookieManager DEFAULT_COOKIE_MANAGER;
static
{
DEFAULT_COOKIE_MANAGER = new CookieManager();
DEFAULT_COOKIE_MANAGER.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
}

在OnViewCreated((中,

if (CookieHandler.getDefault() != DEFAULT_COOKIE_MANAGER)
{
CookieHandler.setDefault(DEFAULT_COOKIE_MANAGER);
}

当数据源创建加载时,而不是

final DataSource.Factory dataSourceFactory=新的DefaultDataSourceFactory(..(

我添加了

DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory(MediaHelper.USER_AGENT);
dataSourceFactory.getDefaultRequestProperties().set("Cookie", "cookieValue");

那就行了!

如ExoPlayer文档中所述,当尝试打开连接导致响应代码不在2xx范围内时,会抛出InvalidResponseCodeException

错误消息告诉您服务器已拒绝该请求,响应代码为403,这意味着您被禁止访问该资源。

考虑到它在启用身份验证之前就已经工作了,很可能是您的令牌生成代码工作不正常,正在生成服务器认为无效的令牌。

最新更新