【问题标题】:ExoPlayer in Android not load with M3U8 + QueryParameter(auth)Android 中的 ExoPlayer 无法使用 M3U8 + QueryParameter(auth) 加载
【发布时间】:2021-07-28 10:57:31
【问题描述】:

我正在使用 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:源错误。 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?

任何关于 set mimetype 的想法都在这里描述Android HLS video mime type

【问题讨论】:

    标签: android video-streaming mime-types http-live-streaming exoplayer


    【解决方案1】:

    我可以找到解决办法,

    在初始化类的时候,我添加了

    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");
    

    然后就可以了!

    【讨论】:

    • 您能否分享从 init 开始播放 hls 的完整源代码,先生?
    • @DươngNguyễnVăn 实际上这个答案是完整的代码,“当初始化类时”、“OnViewCreated()”、“当数据源创建加载时”这些是 3 个步骤,我添加了要做什么步骤内。所以仔细阅读答案。
    【解决方案2】:

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

    错误信息告诉你服务器拒绝了请求,响应码为403,意味着你被禁止访问资源。

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

    【讨论】:

    • 根据您提到的文档,(exo player doc)您是正确的,但问题是我在 IOS 应用程序中测试了相同的开发,此 URL 有效并且查询参数似乎没问题。那么我的android exo播放器应该还有另一个原因,m3u8 +“auth query”url。
    • 在您的构建器中,您有两个键(exp、test)并且您似乎设置了两次test 键(test=/test/232323-3232323/*、test=24242c0232n3223),而示例你在顶部给出了三个键(exp、acl、test)。建设者在这里肯定做正确的事吗?您确定需要在构建器中设置acl 键吗?此外,端点不同(test-auth vs video-auth),但我认为这是故意的。
    • " exp=14637437e~acl=/msnt/4837483-bb1e3ee-323-832e23-2323cnds/*~hmad=65b64d32323370e "这是正确的格式。
    • 我用正确的元素编辑了我的问题中的查询参数。
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多