我最近几天真的遇到了问题,但我无法找到确切的解决方案,请帮助我.
我想要合并两个.mp3或任何音频文件,并播放最后一个mp3文件.但是当我组合两个文件时,最终的文件大小是可以的,但是当我试图播放它只是播放第一个文件,我已经尝试过SequenceInputStream或字节数组,但我无法得到确切的结果,请帮助我.
我的代码如下:
public class MerginFileHere extends Activity { public ArrayList<String> audNames; byte fileContent[]; byte fileContent1[]; FileInputStream ins,ins1; FileOutputStream fos = null; String combined_file_stored_path = Environment .getExternalStorageDirectory().getPath() + "/AudioRecorder/final.mp3"; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); audNames = new ArrayList<String>(); String file1 = Environment.getExternalStorageDirectory().getPath() + "/AudioRecorder/one.mp3"; String file2 = Environment.getExternalStorageDirectory().getPath() + "/AudioRecorder/two.mp3"; File file = new File(Environment.getExternalStorageDirectory() .getPath() + "/AudioRecorder/" + "final.mp3"); try { file.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } audNames.add(file1); audNames.add(file2); Button btn = (Button) findViewById(R.id.clickme); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub createCombineRecFile(); } }); } public void createCombineRecFile() { // String combined_file_stored_path = // File path in String to store // recorded audio try { fos = new FileOutputStream(combined_file_stored_path,true); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { File f = new File(audNames.get(0)); File f1 = new File(audNames.get(1)); Log.i("Record Message","File Length=========>>>" + f.length()+"------------->"+f1.length()); fileContent = new byte[(int) f.length()]; ins = new FileInputStream(audNames.get(0)); int r = ins.read(fileContent);// Reads the file content as byte fileContent1 = new byte[(int) f1.length()]; ins1 = new FileInputStream(audNames.get(1)); int r1 = ins1.read(fileContent1);// Reads the file content as byte // from the list. Log.i("Record Message","Number Of Bytes Readed=====>>>" + r); //fos.write(fileContent1);// Write the byte into the combine file. byte[] combined = new byte[fileContent.length + fileContent1.length]; for (int i = 0; i < combined.length; ++i) { combined[i] = i < fileContent.length ? fileContent[i] : fileContent1[i - fileContent.length]; } fos.write(combined); //fos.write(fileContent1);* } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fos.close(); Log.v("Record Message","===== Combine File Closed ====="); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
解决方法
我已经发布了一个这个函数的应用程序…尝试我的方法使用SequenceInputStream,在我的应用程序,我只是合并17个MP3文件,并使用JNI库MPG123播放,但我测试了使用MediaPlayer的文件没有问题.
这段代码不是最好的,但它的作品…
private void mergeSongs(File mergedFile,File...mp3Files){ FileInputStream fisToFinal = null; FileOutputStream fos = null; try { fos = new FileOutputStream(mergedFile); fisToFinal = new FileInputStream(mergedFile); for(File mp3File:mp3Files){ if(!mp3File.exists()) continue; FileInputStream fisSong = new FileInputStream(mp3File); SequenceInputStream sis = new SequenceInputStream(fisToFinal,fisSong); byte[] buf = new byte[1024]; try { for (int readNum; (readNum = fisSong.read(buf)) != -1;) fos.write(buf,readNum); } finally { if(fisSong!=null){ fisSong.close(); } if(sis!=null){ sis.close(); } } } } catch (IOException e) { e.printStackTrace(); }finally{ try { if(fos!=null){ fos.flush(); fos.close(); } if(fisToFinal!=null){ fisToFinal.close(); } } catch (IOException e) { e.printStackTrace(); } } }