Android ExoPlayer 播放私有(private) Vimeo 视频

标签 android video-streaming uri vimeo exoplayer

我正在尝试使用 ExoPlayer 播放 Vimeo 视频这是代码:

val dataSourceFactory = DefaultDataSourceFactory(requireContext(),
                getUserAgent(requireContext(), requireContext().getString(R.string.app_name)))
val videoSource = ProgressiveMediaSource.Factory(dataSourceFactory)
                .createMediaSource(Uri.parse(videoLink))
player.prepare(videoSource)

这会引发以下异常:
com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:300)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:961)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)

我还尝试使用 AndroidVimeoExtractor 提取 Vimeo url它失败了,但有以下异常(exception):
java.io.IOException: Video has restricted playback

这是代码:
VimeoExtractor.getInstance().fetchVideoWithIdentifier(
                "videoIdentifier",
                null,
                object : OnVimeoExtractionListener {
                    override fun onSuccess(video: VimeoVideo) {
                        Logger.i("video: ${video.streams.size}")
                    }

                    override fun onFailure(throwable: Throwable) {
                        Logger.e(throwable)
                    }

                })

这是 Vimeo 视频链接的示例:http://player.vimeo.com/external/videoIdentifier.sd.mp4?s=value&profile_id=value&oauth2_token_id=value

注意:我不是上传视频的人。另外,当我将链接放入 Google Chrome Browser 时它重定向到另一个链接并正常播放视频。所以我需要类似的东西来获得最终链接以将其传递给 ExoPlayer .

最佳答案

有两种方法可以处理此问题
第一种解决方案

  • 使用 Vimeo 网络 API a link获取视频 URI 并使用它
  • 为 on vimeo 开发者创建应用程序 a link
  • 使用您的应用访问 token 和视频 ID,您可以获得视频 URL,然后将其传递给 Exo 播放器

  • 第二种解决方案 (这是解决方法和快速解决方案)
  • 使用 web View 重定向到 .mp4 url​​,然后使用重定向的 url 以 .mp4 结尾,用 Exo 播放器
  • 打开它
    
         webView = WebView(context).apply {
                settings.javaScriptEnabled = false
                webViewClient = object : WebViewClient() {
                    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
                        val requestUrl = request?.url.toString()
                        val uri = requestUrl.toUri()
                        if (isVideoLink(requestUrl)) {
                            preparePlayer(uri)
                            webView?.release()
                            webView = null
                            return true
                        }
                        return false
                    }
                }
                loadUrl(url)
        }
        
        fun isVideoLink(url: String): Boolean {
            return getMimeType(url)?.contains("video", true) ?: false
        }
    
    

    关于Android ExoPlayer 播放私有(private) Vimeo 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60171827/

    相关文章:

    android - 如何编写测试来检查 Robolectric 中 View 可见性是否消失?

    node.js - 是否有 talky.io 的开源替代品?

    c++ - 如何将 URI 列表编码为字符串?

    javascript - iOS 和 Android 中的任何浏览器是否允许在应用程序(浏览器)处于非 Activity 状态/后台时触发事件?

    android - 如何获取 SoftInputMode 的值

    java - 如何从 String 取回 InputStream

    iphone - 使用 VLC,是否可以在同一台计算机上对 30 到 40 个基于 IP 的网络摄像头进行编码?

    Android 相机 RTSP/RTP 流?

    来自uri的android文件名与实际文件名不同

    ruby-on-rails - 使用 omniauth-google-oauth2 redirect_uri_mismatch 进行身份验证