2016-11-14 25 views
7

Я просто конвертирую mp3-файл в байтовый код и переконвертирую его в mp3 и сохраняя на SD-карте, весь процесс идет успешно, но проблема в том, что сохраненный mp3-файл не воспроизводится на устройстве mp3-плеера, отображающем неподдерживаемый формат.Mp3-файл не воспроизводится после преобразования из байта [] android

Есть ли какие-либо проблемы в моей ниже коде

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

} 

или что-нибудь я отсутствую. Пожалуйста, помогите друзьям.

+1

Почему вы кодируете и декодируете в 'Base64'? Как 'Base64' каким-либо образом связан с кодировкой' mp3'? –

+0

Да, я думаю, что мой процесс неправильный. Есть ли другой способ? На самом деле я просто хочу присоединиться к двум mp3-файлам и сделать еще один mp3-файл, поэтому я просто пытаюсь кодировать и декодировать с помощью Base64. Любой другой способ сделать это? Помощь Plz. – Bikash

+0

Вы можете проверить [this] (http://stackoverflow.com/questions/21381585/concatenate-mp3-files-in-java) –

ответ

0

Почему вы конвертировали этот mp3 в Base64? Если вы хотите сохранить на карту памяти сделать ниже код

private void convertBytesToFile(byte[] bytearray) { 

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

Попробуйте этот код может решить проблему,

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

Воспроизведение медиа-файла в любом медиа-плеер.

0

Для воспроизведения MP3 (в вашем сценарии)

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

Как Jonas metioned, слияние двух файлов mp3 не так просто, как объединение их байтов, как файлы содержат метаданные. Однако есть решение, вы можете использовать FFmpeg. Вы можете использовать встроенную сборку или обертку, такую ​​как JavaCV. Вот пример того, как объединить два mp3 файлов с помощью JavaCV

 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 предполагая, что частота дискретизации для обоих файлов тот же