ExoPlayer - воспроизведение локального файла mp4 на SD-карте

Я использую приложение Exoplayer Demo и хочу предварительно загрузить видео MP4 с SD-карты. Я пробовал реализацию с этой должности, но она не работает. Нет такого класса DemoUtil.java в моей демонстрационной версии exoplayer. Вместо этого используется:

public static final Sample[] LOCAL_VIDEOS = new Sample[] {
new Sample("Some User friendly name of video 1",
"/mnt/sdcard/video1.mp4", Util.TYPE_OTHER),
};

Я также не мог использовать их фрагмент кода, упомянутый для SampleChooserActivity.java. (Хватит давать мне ошибки)

Вместо этого я использовал:

group = new SampleGroup("Local Videos");
group.addAll(Samples.LOCAL_VIDEOS);
sampleGroups.add(group);

Что я делаю не так? Изменяется ли путь к файлу для каждого устройства?

Ответ 1

Не пробовал демонстрационное приложение, но мне удалось создать свой собственный пример воспроизведения локальных аудиофайлов и разместил его здесь: https://github.com/nzkozar/ExoplayerExample

Вот основная часть, которая делает всю работу по подготовке игрока из файла Uri:

private void prepareExoPlayerFromFileUri(Uri uri){
        exoPlayer = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector(null), new DefaultLoadControl());
        exoPlayer.addListener(eventListener);

        DataSpec dataSpec = new DataSpec(uri);
        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;
            }
        };
        MediaSource audioSource = new ExtractorMediaSource(fileDataSource.getUri(),
                factory, new DefaultExtractorsFactory(), null, null);

        exoPlayer.prepare(audioSource);
    }

Вы можете получить Uri следующим образом: Uri.fromFile(file)

После того, как вы подготовили файл для воспроизведения, как показано выше, вам нужно только вызвать exoPlayer.setPlayWhenReady(true); для начала воспроизведения.

Для видеофайла вам, вероятно, нужно будет только прикрепить внешний вид к вашему объекту exoPlayer, но я еще не сделал этого с ExoPlayer2.

Ответ 2

Для тех, кто хочет воспроизвести видео из активов с помощью ExoPlayer 2, можно найти способ:

String playerInfo = Util.getUserAgent(context, "ExoPlayerInfo");
DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(
        context, playerInfo
);
MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory)
    .setExtractorsFactory(new DefaultExtractorsFactory())
    .createMediaSource(Uri.parse("asset:///your_video.mov"));
player.prepare(mediaSource);

Ответ 3

Воспроизведение видео с SD-карты работало со следующим кодом. Мой тестовый файл находится в папке "Видео" в sdcard.

public static final Sample[] LOCAL_VIDEOS = new Sample[] {
        new Sample("test",
            Environment.getExternalStorageDirectory()+"/Videos/test.mp4", Util.TYPE_OTHER),
};

Ответ 4

В некоторых устройствах вы можете напрямую использовать этот путь "/sdcard/nameoffile.mp4".

Ответ 5

Это сработало для меня. Попробуйте эти шаги:

Получить путь к файлу и запустить плеер

File myFile = new File(extStore.getAbsolutePath() + "/folder/videos/" + video_name);  
videoUrl= String.valueOf(Uri.fromFile(myFile));  
initializePlayer(videoUrl);

Инициализация игрока

private void initializePlayer(String videoUrl) {
    player = ExoPlayerFactory.newSimpleInstance(
            new DefaultRenderersFactory(getActivity()),
            new DefaultTrackSelector(), new DefaultLoadControl());

    playerView.setPlayer(player);

    player.setPlayWhenReady(playWhenReady);
    player.seekTo(currentWindow, playbackPosition);

    Uri uri = Uri.parse(videoUrl);
    MediaSource mediaSource = buildMediaSource(uri);
    player.prepare(mediaSource, resetPositionBoolean, false);
}   

Создание медиа источника

  private MediaSource buildMediaSource(Uri uri) {
    return new ExtractorMediaSource.Factory(
            new DefaultDataSourceFactory(getActivity(),"Exoplayer-local")).
            createMediaSource(uri);
}

Ответ 6

Для тех, кто хочет загрузить из папки активов:

активы /xyz.mp4

это работает, загружая файл с:

"Файл: /android_asset/xyz.mp4"

и используя DefaultDataSourceFactory. Проверено на exoplayer 2.4.4.