2012-06-06 18 views
5

Próbuję odtworzyć plik audio w MediaPlayer. Chcę odtwarzać tablicę bajtów w MediaPlayer. Jak mogę to zrobić? Sprawdziłem: this Nie można odtwarzać dźwięku. To tylko generowanie wielu plików na karcie SD. I dając tym błąd:Odtwarzanie macierzy bajtów w MediaPlayer - Android

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) 

Proszę mi pomóc. Wszelka pomoc jest doceniana.

Dzięki

+0

dodać swój kod fragment tutaj i ktoś będzie w stanie pomóc. –

+0

Polecam wypróbowanie wariantu setDataSource, który pobiera offset i długość oprócz FD. Czy wygenerowany plik mp3 jest odtwarzany w aplikacji muzycznej? Ponadto, deleteOnExit nie jest przydatny w systemie Android/Dalvik. – dagalpin

+0

Żaden plik nie jest odtwarzany w mojej aplikacji. Proszę mi pomóc –

Odpowiedz

6

Na podstawie twoich komentarzy używasz pliku WAV do przesyłania strumieniowego. Konwencjonalny WAV has a header na początku pliku, a reszta pliku to czystych danych. Jeśli nie uwzględnisz części nagłówka, to parametry muszą być dostarczone graczowi, aby móc zinterpretować dane (liczba kanałów, próbki na sekundę, rozmiar bloku itp.) W rezultacie WAV Sam plik nie może być przesyłany strumieniowo, parametry muszą być podawane do odtwarzacza.

MPEG-4 z drugiej strony został określony jako zdolny do przesyłania strumieniowego. Zawiera dobrze rozpoznawalne segmenty, które można odtwarzać samodzielnie, tak długo, jak fragment danych zawiera nagłówek, dane po nim mogą być odtwarzane. Oprócz dobrego współczynnika kompresji, jest to jeden z powodów, dlaczego korzysta z niego wiele radia internetowego.

MediaPlayer w systemie Android jest komponentem wysokiego poziomu, a parametry niskiego poziomu, które byłyby wymagane do odtwarzania porcji WAV, nie są dostępne. Jeśli potrzebujesz, aby źródło było WAV i nie może używać innego streamable formats, możesz wypróbować klasę AudioTrack lub OpenSL ES, aby uzyskać jeszcze niższy poziom dostępu. Dla AudioTrack jest to bardzo dobry poradnik: http://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-java-sdk/

+0

Hmm ... ścieżka audio może brzmieć jak droga. – EGHDK

+0

Daj mi znać, jeśli mogę pomóc. – allprog

+0

link do wordpressa jest "martwy", ponieważ blog jest teraz prywatny –

0

Po napisać bajt w pliku: można grać z tej funkcji:

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(); 
    } 

I można uzyskać informacje o pliku stąd:

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

Spróbuj tego:

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(); 
    } 
} 
Powiązane problemy