Android - Проигрывание mp3 от байта []

У меня есть свой mp3 файл в байте [] (загруженный с сервиса), и я хотел бы играть его на своем устройстве, подобном тому, как можно играть файлы:

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE);
mp.prepare();
mp.start();

Но я, может казаться, не нахожу способ сделать это. Я не возражал бы сохранить файл, чтобы позвонить и затем играть его. Как я могу играть файл или загрузить, затем играют его?

32
задан Maxim Kachurovskiy 2 February 2015 в 22:08
поделиться

3 ответа

Хорошо, спасибо всем вам, но мне нужно было играть mp3 из байта[], так как я получаю это от .NET вебсервиса (не хочу хранить динамически сгенерированные mp3 на сервере).

В конце концов - есть количество "gotchas" для проигрывания простых mp3... вот код для любого, кому он нужен:

private MediaPlayer mediaPlayer = new MediaPlayer();
private void playMp3(byte[] mp3SoundByteArray) {
    try {
        // create temp file that will hold byte array
        File tempMp3 = File.createTempFile("kurchina", "mp3", getCacheDir());
        tempMp3.deleteOnExit();
        FileOutputStream fos = new FileOutputStream(tempMp3);
        fos.write(mp3SoundByteArray);
        fos.close();

        // resetting mediaplayer instance to evade problems
        mediaPlayer.reset();

        // In case you run into issues with threading consider new instance like:
        // MediaPlayer mediaPlayer = new MediaPlayer();                     

        // Tried passing path directly, but kept getting 
        // "Prepare failed.: status=0x1"
        // so using file descriptor instead
        FileInputStream fis = new FileInputStream(tempMp3);
        mediaPlayer.setDataSource(fis.getFD());

        mediaPlayer.prepare();
        mediaPlayer.start();
    } catch (IOException ex) {
        String s = ex.toString();
        ex.printStackTrace();
    }
}

EDIT: Я написал этот ответ более 4-х лет назад - очевидно, многое изменилось с тех пор. Смотрите комментарий Джастина о том, как повторно использовать экземпляр MediaPlayer. Также, я не знаю, будет ли .deleteOnExit() работать для вас сейчас - не стесняйтесь предложить улучшение, чтобы временные файлы не сваливались в кучу.

.
73
ответ дан 27 November 2019 в 19:52
поделиться

Не уверен насчет байтрейзов/байтстримов, но если у вас есть URL от службы, вы можете попробовать настроить источник данных на сетевой URI, позвонив

setDataSource(Context context, Uri uri)

См. документы API.

.
5
ответ дан 27 November 2019 в 19:52
поделиться

ошибочный код:

 MediaPlayer mp = new MediaPlayer();
 mp.setDataSource(PATH_TO_FILE);
 mp.prepare();
 mp.start();

CORRECT CODE:

 MediaPlayer mp = new MediaPlayer();
 mp.setDataSource(PATH_TO_FILE);
 mp.setOnpreparedListener(this);
 mp.prepare();

//Implement OnPreparedListener 
OnPrepared() {
    mp.start();
 }

см. API Demos ...

.
0
ответ дан 27 November 2019 в 19:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: