ExoPlayer читает mp3-файл из необработанной папки

Есть ли возможность установить mp3-файл, который находится в исходной папке приложения, на ExoPlayer?

К сожалению, я безуспешно пытался добиться этого с помощью следующего фрагмента кода:

mMediaPath = "android.resource://" + getPackageName() + File.separator + R.raw.ringtone;

Любая помощь приветствуется!


person Zsolt Boldizsár    schedule 15.06.2015    source источник
comment
Да. Ресурсы, помещенные в необработанную папку, не затрагиваются APPT. Есть много способов добиться этого; но во-первых, ваша папка raw находится внутри папки res?   -  person George Daramouskas    schedule 15.06.2015
comment
Да, это внутри папки res.   -  person Zsolt Boldizsár    schedule 15.06.2015
comment
@GeorgeD, ты нашел какую-нибудь возможность?   -  person Zsolt Boldizsár    schedule 16.06.2015
comment
Вы получаете исключение или какую-либо ошибку в журналах? Можете ли вы опубликовать больше кода о том, как вы создаете и подготавливаете экземпляры ExoPlayer и аудиорендерера, например?   -  person mismor    schedule 22.07.2015


Ответы (3)


Можно загружать файлы из сырой папки, главное использовать RawSourceDataSource.

Вот пример (в Kotlin) для создания LoopingMediaSource для mp3-файла в исходном каталоге:

val uri = RawResourceDataSource.buildRawResourceUri(R.raw.mp3file)
val dataSource = RawResourceDataSource(this)
dataSource.open(DataSpec(uri))

val source = ExtractorMediaSource(uri, DataSource.Factory { dataSource }, Mp3Extractor.FACTORY, null, null)

LoopingMediaSource(source)
person Aaron He    schedule 12.07.2017
comment
Как это будет читаться на Java? Я хочу использовать MergeMediaSource(), чтобы его можно было использовать для смешивания локальных сэмплов с работающим паром… - person Melchior Blausand; 24.06.2018
comment
ExtractorMediaSource устарел - person Tony; 30.06.2021

Я не мог загрузить mp3-файлы из необработанных файлов, поэтому я переместил их в каталог ресурсов в соответствии с обсуждением с одним из авторов ExoPlayer. (https://github.com/google/ExoPlayer/issues/556)

Вот как я получил доступ к mp3-файлам из ресурсов, если кому-то это понадобится в будущем:

mMediaPath = "asset:///my_ringtone.mp3";

и добавил этот путь в DemoPlayer следующим образом:

new DemoPlayer(new ExtractorRendererBuilder(this, userAgent, Uri.parse(mMediaPath), null, new Mp3Extractor()));

Спасибо всем, кто готов ответить на мой вопрос.

person Zsolt Boldizsár    schedule 22.07.2015

Документация этой библиотеки настолько плоха. На написание простого функционала у меня ушло несколько часов. Если кому интересно, этот код работает:

public static void playSound(Context context, int sounRes, float volume)
    {
        //example int sounRes=R.raw.duck;
        SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context);

        DataSpec dataSpec = new DataSpec(RawResourceDataSource.buildRawResourceUri(sounRes));
        final RawResourceDataSource rawResourceDataSource = new RawResourceDataSource(context);
        try {
            rawResourceDataSource.open(dataSpec);
        } catch (RawResourceDataSource.RawResourceDataSourceException e) {
            e.printStackTrace();
        }

        DataSource.Factory factory = () -> rawResourceDataSource;
        ProgressiveMediaSource mediaSource = new ProgressiveMediaSource
                .Factory(factory)
                .createMediaSource(rawResourceDataSource.getUri());

        player.prepare(mediaSource);
        player.setPlayWhenReady(true);
        player.setVolume(volume);

        player.addListener(new Player.EventListener() {
            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if (playbackState == Player.STATE_ENDED) {
                    player.release();
                }
            }
        });
    }

Если вы хотите использовать файл ресурсов, используйте это:

public static void playSound(Context context,String audioPath,float volume)
{
    //example String audioPath = "duck.mp3";
    SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context);

    DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(context,
            Util.getUserAgent(context, "exoPlayerSample"));

    ProgressiveMediaSource mediaSource = new ProgressiveMediaSource
            .Factory(dataSourceFactory)
            .createMediaSource(Uri.parse("asset:///" + audioPath));

    player.prepare(mediaSource);
    player.setPlayWhenReady(true);
    player.setVolume(volume);

    player.addListener(new Player.EventListener() {
        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            if(playbackState == Player.STATE_ENDED){
                player.release();
            }
        }
    }); 
}
person Student    schedule 03.04.2020
comment
Поскольку ExtractorMediaSource устарел и работает с ProgressiveMediaSource, ваш ответ — лучший! - person Tony; 30.06.2021