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

ExoPlayer in Android not load with M3U8 + QueryParameter(auth)

我正在使用 com.google.android.exoplayer2(exoPlayer 版本 = '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: 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:141) at com.google.android.exoplayer2.upstream.DataSourceInputStream.checkOpened(DataSourceInputStream.java:102) at com.google.android.exoplayer2.upstream.DataSourceInputStream.open(DataSourceInputStream.java:65) at com.google.android.exoplayer2.upstream.ParsingLoadable.load(ParsingLoadable.java:125) at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:315) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at 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 video mime type

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

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

鉴于它曾经在启用身份验证之前工作,您的令牌生成代码似乎很可能无法正常工作并且正在生成服务器认为无效的令牌。

我能找到解决办法,

在初始化 class 时,我添加了

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 = new DefaultDataSourceFactory(..)

我加了

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

然后就可以了!