我正在使用 com.google.android.exoplayer2(exoPlayer Version = '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.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException:响应代码:403 在 com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:211) 在 com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:141) 在 com.google.android.exoplayer2.upstream.DataSourceInputStream.checkOpened(DataSourceInputStream.java:102) 在 com.google.android.exoplayer2.upstream.DataSourceInputStream.open(DataSourceInputStream.java:65) 在 com.google.android.exoplayer2.upstream.ParsingLoadable.load(ParsingLoadable.java:125) 在 com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:315) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.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 视频 mime 类型
我可以找到解决方案,
初始化课程时,我添加了
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);
}
当数据源创建加载时,而不是
最终 DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(..)
我添加了
DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory(MediaHelper.USER_AGENT);
dataSourceFactory.getDefaultRequestProperties().set("Cookie", "cookieValue");
然后就可以了!
如 ExoPlayer 文档中所述,当尝试打开连接导致响应代码不在 2xx 范围内时,会抛出
InvalidResponseCodeException
。
错误消息告诉您服务器已拒绝请求,响应代码为403,这意味着您被禁止访问该资源。
鉴于它曾经在启用身份验证之前工作,很可能您的令牌生成代码无法正常工作并且正在生成服务器认为无效的令牌。
以下 3 个选项之一应该有帮助:
// Set user agent
String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36";
DefaultHttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory();
httpDataSourceFactory.setUserAgent(userAgent);
// Set AllowCrossProtocolRedirects
httpDataSourceFactory.setAllowCrossProtocolRedirects(true);
// Set default cookie manager
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
CookieHandler.setDefault(cookieManager);