将编码为Base64的MP3块连接到有效的mp3文件(Java)

时间:2016-03-29 21:22:06

标签: java base64 mp3

我有一长串MP3音频块,每个都编码为Base64 String。 每个块只包含MP3数据,没有标题。

鉴于所有块的采样率,分辨率和通道数相等 - 如何将所有块连接到一个有效的MP3文件,包括所需的标题。

我计划使用Java来完成它,但任何可以从Java执行的命令行应用程序也应该这样做。

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要以下内容:

将base64解码为字节数据

合并/连接文件的所有字节数据

保存到wav

转换为mp3

为了从base64中获取字节,你可以使用任何方法(java 8 apache等) - 我假设你可以这样做而且我没有做任何事情:Decode Base64 data in Java

所以我假设你可以做这样的事情

byte[] bytes = "Hello, World!".getBytes("UTF-8");
String encoded = Base64.getEncoder().encodeToString(bytes);
byte[] decoded = Base64.getDecoder().decode(encoded);

并且您有两个文件转换为字节数组b1和b2。

然后你连接字节并保存到wav文件。如果您可以使用lame mp3 converter并且可以使用它(可能存在法律问题),那么您可以这样做。否则使用一些音频软件将wav转换为mp3。

  try {
    byte[] outData=new byte[b1.length+b2.length+];
    for(i=0; i<b1.length; i++) outData[i]=b1[i];
    for(i=0; i<b2.length; i++) outData[b1.length+i]=b2[i];
    AudioFormat af=audioInputStream.getFormat();
    InputStream byteArrayInputStream=new ByteArrayInputStream(outData);
    AudioFormat af=new AudioFormat(44100f, 16, 2, true, true);

    File fo=new File("out-"+(System.currentTimeMillis()/1000)+".wav");

    AudioInputStream audioOutputStream=new AudioInputStream(byteArrayInputStream, af, outData.length/af.getFrameSize());
    AudioSystem.write(audioOutputStream, AudioFileFormat.Type.WAVE, fo);

  String cmd="\""+"C:/lame"+"\""+
                " -h "+fo.getName()+" "+fo.getName().substring(0, fo.getName().lastIndexOf(".")+1)+"mp3";
        Runtime rt = Runtime.getRuntime();
        final Process pr=rt.exec(cmd);

    Thread th=new Thread() {
      public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(pr.getErrorStream());
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            int i=0;
            while ( (line = br.readLine()) != null) {
System.out.println("line "+i+" >" + line);
                i++;
            }
  }
  catch(Exception ex) { ex.printStackTrace(); }
      }
    };
    th.start();


        int exitVal=pr.waitFor();
        System.out.println("ExitValue: " + exitVal);
  }
  catch(Exception ex) { ex.printStackTrace(); }

-

要确保下一个文件以良好的边界(通常为4个字节)开始,请执行以下操作:

    int add=4-b1.length%4;
    byte[] outData=new byte[b1.length+add+b2.length+];
    for(i=0; i<b1.length; i++) outData[i]=b1[i];
    for(i=0; i<b2.length; i++) outData[b1.length+add+i]=b2[i];

如果你有很多文件也一样。