Вопрос по android – Воспроизведение байтового массива в MediaPlayer - Android

5

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

 public void writeSamples(byte[] samples, int length) 
{
  //  track.write( samples, 0, length);
    File tempMp3;
    try {
    tempMp3 = File.createTempFile("kurchina", ".mp3");
      tempMp3.deleteOnExit();
      FileOutputStream fos = new FileOutputStream(tempMp3);
      fos.write(samples);
      fos.close();
      // Tried reusing instance of media player
      // but that resulted in system crashes...  
      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 e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    }

Но это не играет аудио. Он просто генерирует много файлов на SD-карте. И давая этоerror:

 06-06 11:02:59.191: E/MediaPlayer(1831): Unable to to create media player
 06-06 11:02:59.191: W/System.err(1831): java.io.IOException: setDataSourceFD failed.:      status=0x80000000
 06-06 11:02:59.201: W/System.err(1831):  at    android.media.MediaPlayer.setDataSource(Native Method)
 06-06 11:02:59.201: W/System.err(1831):  at   android.media.MediaPlayer.setDataSource(MediaPlayer.java:749)
 06-06 11:02:59.201: W/System.err(1831):  at   org.vinuxproject.sonic.SonicTest$1.run(SonicTest.java:178)
 06-06 11:02:59.201: W/System.err(1831):  at java.lang.Thread.run(Thread.java:1096)

Пожалуйста, помогите мне. Любая помощь приветствуется.

Спасибо

Работает ли это, если указать каталог сcreateTempFile(String, String, File)? Есть ли разница между внешним / внутренним? Где сейчас создаются временные файлы? Geobits
Я рекомендую попробовать вариант setDataSource, который принимает смещение и длину в дополнение к FD. Воспроизводится ли сгенерированный файл mp3 в музыкальном приложении? Кроме того, deleteOnExit бесполезен в Android / Dalvik. dagalpin
Ни один файл не воспроизводится в моем приложении. пожалуйста, помогите мне Krishna Suthar
добавьте сюда свой фрагмент кода, и кто-то сможет помочь. Andro Selva
Лиsamples массив содержит данные в формате mp3 или просто необработанные данные PCM? Michael

Ваш Ответ

3   ответа
6

вы используете файл WAV для потоковой передачи. общепринятыйWAV имеет заголовок в начале файла, а остальная часть файлаpure data, Если вы не включили часть заголовка, то параметры из нее должны быть предоставлены игроку, чтобы иметь возможность интерпретировать данные (количество каналов, выборок в секунду, размер блока и т. Д.). В результате WAV Один файл не является потоком, параметры должны быть введены в плеер.

MPEG-4, с другой стороны, было указано, что он способен к потоковой передаче. Он содержит хорошо идентифицируемые сегменты, которые можно воспроизводить в одиночку, поэтому, пока блок данных содержит заголовок, данные после него могут быть воспроизведены. В дополнение к его хорошей степени сжатия, это одна из причин, по которой многие интернет-радиостанции используют его.

MediaPlayer в Android это компонент высокого уровня, а параметры низкого уровня, которые потребуются для воспроизведения фрагмента WAV, недоступны. Если вам нужен источник WAV и вы не можете использовать другиерастровые форматытогда вы можете попробоватьЗвуковая дорожка класс илиOpenSL ES для еще более низкого уровня доступа. Для AudioTrack это очень хороший учебник:http://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-java-sdk/

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

Вы можете играть из этой функции:

 void playSound(int resid) {
        MediaPlayer eSound = MediaPlayer.create(context, resid);
        Resources res = context.getResources();
        AssetFileDescriptor afd = res.openRawResourceFd(resid);
        eSound.reset();
        eSound.setAudioStreamType(AudioManager.STREAM_SYSTEM);
        try {
            eSound.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
                    afd.getLength());
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            eSound.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        eSound.start();
    }

И вы можете получить информацию о файле здесь:

byte[] getFileInformation(String filepath) {
        MediaPlayer eSound = MediaPlayer.create(context, Uri.parse(filepath));
        eSound.reset();
        eSound.setAudioStreamType(AudioManager.STREAM_SYSTEM);
        try {
            eSound.setDataSource(filepath);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            eSound.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        int duration = eSound.getDuration() / 1000;

        int height = 480;
        int width = 640;
        height = eSound.getVideoHeight();
        width = eSound.getVideoWidth();

        eSound.release();
        File f = new File(filepath);
        int size = (int) f.length();
        byte[] b = new byte[16];
        System.arraycopy(convertIntToByte(size), 0, b, 0, 4);
        System.arraycopy(convertIntToByte(duration), 0, b, 4, 4);
        System.arraycopy(convertIntToByte(width), 0, b, 8, 4);
        System.arraycopy(convertIntToByte(height), 0, b, 12, 4);
        return b;
    }
0

private void playMp3(byte[] mp3SoundByteArray) 
{
    try 
    {

        File path=new File(getCacheDir()+"/musicfile.3gp");

        FileOutputStream fos = new FileOutputStream(path);
        fos.write(mp3SoundByteArray);
        fos.close();

        MediaPlayer mediaPlayer = new MediaPlayer();

        FileInputStream fis = new FileInputStream(path);
        mediaPlayer.setDataSource(getCacheDir()+"/musicfile.3gp");

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

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