首页 > 解决方案 > 如何使用 exoplayer 播放本地文件?

问题描述

我想使用 exoPlayer 播放本地文件(在内部或外部存储中)。我尝试了一些代码,但没有发现任何有用的东西。代码:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    String filePath = Constant.allMediaList.get(position).toString();
    Uri videoUrl = Uri.parse(filePath);
    Log.d("filePathLocation",filePath);
    simpleExoPlayer = new SimpleExoPlayer.Builder(this).build();
    DataSpec dataSpec = new DataSpec(videoUrl);
    final FileDataSource fileDataSource = new FileDataSource();
    try {
        fileDataSource.open(dataSpec);
    } catch (FileDataSource.FileDataSourceException e) {
        e.printStackTrace();
    }
    DataSource.Factory factory = new DataSource.Factory() {
        @Override
        public DataSource createDataSource() {
            return fileDataSource;
        }
    };
    simpleExoPlayer.prepare(buildMediaSourceNew(videoUrl));
    playerView.setPlayer(simpleExoPlayer);
    simpleExoPlayer.setPlayWhenReady(true);

buildMediaSourceNew()

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

使用此代码后,有些文件可以播放,有些则不能。例如:
第一个文件位置:

/storage/emulated/0/Download/Short Animated Film.mp4

第二个文件位置:

/storage/emulated/0/browser/#1 Django tutorials _ What is Django_ _ Python Web Framework.mp4

可以播放第一个文件,但发生以下错误的第二个文件。
如果文件名包含“#”或“?” exoplayer 玩不了。

    2020-09-18 20:40:56.985 10985-11347/com.example.learning E/ExoPlayerImplInternal: Source error
  com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException: com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException: uri has query and/or fragment, which are not supported. Did you call Uri.parse() on a string containing '?' or '#'? Use Uri.fromFile(new File(path)) to avoid this. path=/storage/emulated/0/browser/,query=null,fragment=1 Django tutorials _ What is Django_ _ Python Web Framework.mp4
    at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:97)
    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:956)
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
    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)
 Caused by: com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException: uri has query and/or fragment, which are not supported. Did you call Uri.parse() on a string containing '?' or '#'? Use Uri.fromFile(new File(path)) to avoid this. path=/storage/emulated/0/browser/,query=null,fragment=1 Django tutorials _ What is Django_ _ Python Web Framework.mp4
    at com.google.android.exoplayer2.upstream.FileDataSource.openLocalFile(FileDataSource.java:112)
    at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:88)
    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:956) 
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391) 
    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) 
 Caused by: java.io.FileNotFoundException: /storage/emulated/0/browser: open failed: EISDIR (Is a directory)
    at libcore.io.IoBridge.open(IoBridge.java:485)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:288)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:151)
    at com.google.android.exoplayer2.upstream.FileDataSource.openLocalFile(FileDataSource.java:108)
    at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:88) 
    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:956) 
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391) 
    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) 
 Caused by: android.system.ErrnoException: open failed: EISDIR (Is a directory)
    at libcore.io.IoBridge.open(IoBridge.java:475)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:288) 
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:151) 
    at com.google.android.exoplayer2.upstream.FileDataSource.openLocalFile(FileDataSource.java:108) 
    at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:88) 
    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:956) 
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391) 
    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) 

如何避免这个错误?

标签: androidandroid-studioexoplayer

解决方案


推荐阅读