【问题标题】:Exoplayer not playing local file on local storageExoplayer 不在本地存储上播放本地文件
【发布时间】:2017-11-01 00:07:46
【问题描述】:

我正在尝试在这样的设备中播放本地文件

String filePath="/storage/emulated/0/MyFiles/Media/Video/Xvid1509401908940.mp4"
File file=new File(filePath);
Uri localUri=Uri.fromFile(file);
exoPlayer_main.initializePlayer(localUri);

获取 ClassCastException

11-01 04:45:23.356 27145-29468/com.example.com.pro_working1 E/LoadTask: Unexpected exception loading stream
                                                                         java.lang.ClassCastException: libcore.net.url.FileURLConnection cannot be cast to java.net.HttpURLConnection
                                                                             at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:393)
                                                                             at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:350)
                                                                             at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:192)
                                                                             at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:692)
                                                                             at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:315)
                                                                             at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                             at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                             at java.lang.Thread.run(Thread.java:818)
11-01 04:45:23.357 27145-29468/com.example.com.pro_working1 E/LoadTask: Unexpected exception loading stream
                                                                         java.lang.ClassCastException: libcore.net.url.FileURLConnection cannot be cast to java.net.HttpURLConnection
                                                                             at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:393)
                                                                             at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:350)
                                                                             at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:192)
                                                                             at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:692)
                                                                             at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:315)
                                                                             at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                             at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                             at java.lang.Thread.run(Thread.java:818)

My ExoPlayer 用于初始化 exoplayer 的方法

 public void initializePlayer(Uri uri){
        Log.d(TAG,"Init Player Calling");

        if (player==null){
            Log.d(TAG,"Player Is Null Setting Up Player");
            player= ExoPlayerFactory.newSimpleInstance(
                    new DefaultRenderersFactory(context),
                    new DefaultTrackSelector(),
                    new DefaultLoadControl());
            playerView.setPlayer(player);
            player.addListener(componentListener);
            player.setPlayWhenReady(playWhenReady);
            player.seekTo(currentWindow,playbackPosition);

            MediaSource mediaSource=buildMediaSource(uri);
            player.prepare(mediaSource,true,false);
        }
    }

    private MediaSource buildMediaSource(Uri uri){
        return new ExtractorMediaSource(uri,
                new DefaultHttpDataSourceFactory("ua"),
                new DefaultExtractorsFactory(),null,null);

    }

我尝试Uri.parse(path) 并按照上述方式归档,但它仍然给我ClassCastException。请指导我如何在 exoplayer 中播放本地存储文件。

【问题讨论】:

标签: java android uri exoplayer


【解决方案1】:

我从谷歌官方 Exoplayer 存储库得到了答案

DefaultDataSource 支持本地和 Http 源。它会自动检测使用哪一个。

所以我改变了

private MediaSource buildMediaSource(Uri uri){
        return new ExtractorMediaSource(uri,
                new DefaultHttpDataSourceFactory("ua"),
                new DefaultExtractorsFactory(),null,null);

    }

到这里

private MediaSource buildMediaSource(Uri uri){    
        return new ExtractorMediaSource(uri,
                new DefaultDataSourceFactory(context,"ua"),
                new DefaultExtractorsFactory(),null,null);

    }

DefaultDataSourceFactory 自动检测流媒体或本地存储文件,其中DefaultHttpDataSourceFactory 仅适用于流媒体请求。

更新:随着新版本的推出 (2.9.0)。一些类也被弃用了媒体资源。我正在使用新版本的媒体源,它可以播放几乎所有类型的文件(MP3、MP4、AVI 等)

 private MediaSource buildMediaSourceNew(Uri uri,int buildType){    
                DataSource.Factory datasourceFactroy = new DefaultDataSourceFactory(context, Util.getUserAgent(context,"Your App Name"));
                return new ExtractorMediaSource.Factory(datasourceFactroy).createMediaSource(uri);
}

【讨论】:

  • ExtractorMediaSource() 已弃用,您应该使用ExtractorMediaSource.Factory(DefaultDataSourceFactory(context, "ua")).createMediaSource(uri)
  • 你确定支持 AVI 吗?
  • 是的,并在大多数格式(音频/视频)上进行了尝试和测试,但不确定如何在 Exoplayer 中流式传输 Youtube 视频
  • 现在整个ExtractorMediaSource 类已被贬值(“改用 ProgressiveMediaSource”)。该死,这个球员已经完成使用,所有这些持续的快速变化就像盐伤了。
猜你喜欢
  • 2015-04-23
  • 2016-06-11
  • 2022-10-11
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多