2016-11-14 2 views
7

Ich konvertiere gerade eine MP3-Datei in Byte-Code und konvertieren Sie diese Byte-Code in MP3 und gespeichert auf SD-Karte, der Prozess wird erfolgreich, aber das Problem ist, dass die gespeicherte MP3-Datei spielt nicht auf dem Gerät mp3 player es zeigt nicht unterstütztes Format.Mp3-Datei spielt nicht nach der Konvertierung von Byte [] android

Gibt es irgendein Problem in meinem Code unten

private void convertBytesToFile(byte[] bytearray) { 


    byte[] bytes = bytearray; 

    String encoded = Base64.encodeToString(bytes, 0); 
    // Utilities.log("~~~~~~~~ Encoded: ", encoded); 

    byte[] decoded = Base64.decode(encoded, 0); 
    //Utilities.log("~~~~~~~~ Decoded: ", Arrays.toString(decoded)); 

    try 
    { 
     File file2 = new File(Environment.getExternalStorageDirectory() + "/hello-2.mp3"); 
     FileOutputStream os = new FileOutputStream(file2, true); 

     os.write(decoded); 
     os.close(); 
    } 
    catch (Exception e) 
    { 
     Toast.makeText(this, "Somthing wrong", Toast.LENGTH_SHORT).show(); 
     e.printStackTrace(); 
    } 

} 

oder etwas bin ich von fehlt. Bitte helfen Sie Freunden.

+1

Warum codieren und dekodieren Sie in 'Base64'? Wie 'Base64' irgendwie mit' mp3' Kodierung verwandt ist? –

+0

Ja, ich denke mein Prozess ist falsch. Gibt es einen anderen Weg? Eigentlich möchte ich nur zwei mp3-Dateien verbinden und eine andere mp3-Datei machen, deshalb versuche ich einfach mit Base64 zu kodieren und zu dekodieren. Irgendeine andere Möglichkeit, das zu machen? PLZ Hilfe. – Bikash

+0

Sie könnten dies überprüfen (http://stackoverflow.com/questions/21381585/concatenate-mp3-files-in-java) –

Antwort

0

Warum haben Sie das mp3 in Base64 konvertiert? Wenn Sie auf SD-Karte speichern möchten, tun Code unten

private void convertBytesToFile(byte[] bytearray) { 

    FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory() + "/hello-2.mp3"); 
    fos.write(byteArray); 
    fos.close() 
    } 
0

diesen Code Versuchen kann Ihr Problem beheben,

private void convertBytesToFile(byte[] bytearray) { 
    try { 

     File outputFile = File.createTempFile("MediaFile", "mp3", getCacheDir()); 
     outputFile.deleteOnExit(); 
     FileOutputStream fileoutputstream = new FileOutputStream(outputmediafile); 
     fileoutputstream.write(bytearray); 
     fileoutputstream.close(); 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

Wiedergabe der Mediendatei in jedem Media-Player.

0

Für MP3-Wiedergabe (In Ihrem Szenario)

private void playMp3(byte[] mp3SoundByteArray) { 
     try { 
      // create temp file that will hold byte array 
      File tempMp3 = File.createTempFile("fmtemp", "mp3", getCacheDir()); 
      tempMp3.deleteOnExit(); 
      FileOutputStream fos = new FileOutputStream(tempMp3); 
      fos.write(mp3SoundByteArray); 
      fos.close(); 
      mediaPlayer.reset(); 
      FileInputStream fis = new FileInputStream(tempMp3); 
      mediaPlayer.setDataSource(fis.getFD()); 
      mediaPlayer.prepare(); 
      mediaPlayer.start(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
0

Als Jonas metioned, Zusammenführen von zwei mp3-Dateien als Zusammenführung ihrer Bytes nicht so einfach, wie die Dateien Meta-Daten enthalten. Es gibt jedoch eine Lösung, die Sie verwenden können FFmpeg. Sie können entweder den nativen Build oder einen Wrapper wie JavaCV verwenden. Hier ist Beispiel, wie zwei MP3-Dateien zusammenführen JavaCV mit

 FrameGrabber grabber = new FFmpegFrameGrabber("input.mp3"); 
      grabber.start(); 

    FrameGrabber grabber2 = new FFmpegFrameGrabber("input2.mp3"); 
      grabber2.start(); 

      FrameRecorder recorder = new FFmpegFrameRecorder("output.mp3", 
    grabber.getAudioChannels()); 
      recorder.setSampleFormat(grabber.getSampleFormat()); 
      recorder.setSampleRate(grabber.getSampleRate()); 
      recorder.start(); 
      Frame frame; 
      while ((frame = grabber.grabFrame()) != null) { 
       recorder.record(frame); 
      } 
      while ((frame = grabber2.grabFrame()) != null) { 
       recorder.record(frame); 
      } 
      recorder.stop(); 
      grabber.stop(); 
      grabber2.stop(); 

PS Im vorausgesetzt, dass die Abtastrate für beiden Dateien ist die gleiche