我有一长串MP3音频块,每个都编码为Base64 String。 每个块只包含MP3数据,没有标题。
鉴于所有块的采样率,分辨率和通道数相等 - 如何将所有块连接到一个有效的MP3文件,包括所需的标题。
我计划使用Java来完成它,但任何可以从Java执行的命令行应用程序也应该这样做。
谢谢!
答案 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];
如果你有很多文件也一样。