从 byte[] android 转换后 Mp3 文件不播放

Posted

技术标签:

【中文标题】从 byte[] android 转换后 Mp3 文件不播放【英文标题】:Mp3 file is not playing after converting from byte[] android 【发布时间】:2016-11-14 08:48:21 【问题描述】:

我只是将一个 mp3 文件转换为字节码,然后将该字节码重新转换为 mp3 并保存到 sdcard,所有过程都成功,但问题是保存的 mp3 文件没有在设备 mp3 播放器上播放,它显示不支持的格式。

下面的代码有问题吗

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


或者我缺少的任何东西。 请朋友帮忙。

【问题讨论】:

为什么要在Base64中编码和解码? Base64mp3 编码有什么关系? 是的,我认为我的过程是错误的。还有其他方法吗?实际上我只是想加入两个 mp3 文件并制作另一个 mp3 文件,这就是为什么我只是尝试使用 Base64 进行编码和解码。还有其他方法可以做到这一点吗?请帮忙。 您可以查看this 也考虑阅读this 让我检查一下.. 谢谢.. :D 【参考方案1】:

你为什么把那个 mp3 转换成 Base64?如果要保存到 SD 卡,请执行以下代码

private void convertBytesToFile(byte[] bytearray) 

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

【讨论】:

【参考方案2】:

用于播放 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();
        
    

【讨论】:

【参考方案3】:

android SDK 没有 mp3 编码器。如果要将 byte[] 保存为 .mp3 文件,请使用以下原生库。

https://github.com/naman14/TAndroidLame https://github.com/yhirano/SimpleLameLibForAndroid

【讨论】:

【参考方案4】:

正如Jonas 提到的,合并两个 mp3 文件并不像合并它们的字节那么容易,因为文件包含元数据。不过有一个解决方案,您可以使用FFmpeg。您可以使用本机构建或包装器,例如JavaCV。下面是如何使用 JavaCV 合并两个 Mp3 文件的示例

      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 我假设两个文件的采样率是相同的

【讨论】:

【参考方案5】:

https://github.com/adrielcafe/AndroidAudioConverter

(在您的 Android 应用中轻松转换音频文件。支持的格式:AAC、MP3、M4A、WMA、WAV 和 FLAC)

【讨论】:

【参考方案6】:

试试这个代码可能会解决你的问题,

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

在任何媒体播放器中播放媒体文件。

【讨论】:

以上是关于从 byte[] android 转换后 Mp3 文件不播放的主要内容,如果未能解决你的问题,请参考以下文章

java中如何让byte[]与string类型转换后,保持不变

Android:从位图转换为 Byte[] OutOfMemory 错误

Naudio mvc 将 mp3 转换为 wav

Android - 如何将图片从 webview.capturePicture() 转换为 byte[] 并返回位图

使用 NAudio 直接从转换后的 MP3 文件中读取样本

如何将 byte[] 转换为 GameObject? (统一安卓)[重复]