代码之家  ›  专栏  ›  技术社区  ›  androidXP

Exoplayer未在本地存储上播放本地文件

  •  2
  • androidXP  · 技术社区  · 7 年前

    我正试图像这样在设备中播放本地文件

    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)
    

    用于初始化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

    1 回复  |  直到 7 年前
        1
  •  18
  •   androidXP    5 年前

    我从谷歌官方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);
    }