2012-06-06 6 views
5

Ich versuche, eine Audio-Datei mit dem MediaPlayer zu spielen. Ich möchte Byte-Array im MediaPlayer abspielen. Wie kann ich das machen? Ich habe überprüftPlay Byte Array in MediaPlayer - Android

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

Aber es spielt nicht Audio. Es erzeugt nur viele Dateien auf der SD-Karte. Und gibt dieses Fehler:

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) 

Bitte helfen Sie mir. Jede Art von Hilfe wird geschätzt.

Dank

+0

fügen Sie Ihren Code Schnipsel hier und jemand wird helfen können. –

+0

Ich würde empfehlen, die setDataSource-Variante auszuprobieren, die zusätzlich zum FD einen Offset und eine Länge benötigt. Wird die generierte MP3-Datei in der Musik-Anwendung abgespielt? Außerdem ist deleteOnExit in Android/Dalvik nicht nützlich. – dagalpin

+0

In meiner Anwendung wird keine Datei abgespielt. Bitte helfen Sie mir –

Antwort

6

Basierend auf Ihre Kommentare, verwenden Sie eine WAV-Datei für das Streaming. Herkömmliche WAV has a header am Anfang der Datei und der Rest der Datei ist reine Daten. Wenn Sie den Header-Part nicht angeben, müssen dem Player die Parameter bereitgestellt werden, die in der Lage sind, die Daten zu interpretieren (Anzahl der Kanäle, Samples pro Sekunde, Blockgröße usw.). Als Ergebnis wird ein WAV angezeigt Datei allein ist nicht streambar, die Parameter müssen in den Player eingespeist werden.

MPEG-4 auf der anderen Seite wurde spezifiziert, um in der Lage zu sein, zu streamen. Es enthält gut identifizierbare Segmente, die alleine gespielt werden können, solange der Datenblock eine Kopfzeile enthält, können die Daten danach abgespielt werden. Zusätzlich zu seiner guten Komprimierungsrate ist dies einer der Gründe, warum viele Internetradios es verwenden.

MediaPlayer in Android ist eine High-Level-Komponente und die Low-Level-Parameter, die für die Wiedergabe eines WAV-Chunk benötigt werden, sind nicht zugänglich. Wenn Sie möchten, dass die Quelle WAV ist und andere streamable formats nicht verwenden können, können Sie die AudioTrack Klasse oder OpenSL ES für noch niedrigeren Zugriff versuchen. Für Audiotrack ist dies ein sehr gutes Tutorial: http://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-java-sdk/

+0

Hmm ... audioTrack klingt vielleicht wie der Weg zu gehen. – EGHDK

+0

Lass es mich wissen, wenn ich helfen kann. – allprog

+0

der Wordpress-Link ist "tot" in dem Blog ist jetzt privat –

0

Nachdem ein Byte auf Datei schreiben: Sie aus dieser Funktion spielen können:

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

Und Sie können von hier aus Datei-Informationen erhalten:

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

Try this:

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