2017-06-20 142 views
0

我正在使用com.googlecode.mp4parser庫合併音頻文件。我有一個外部音頻mp3文件,我存儲在raw資源。該文件無法合併由於以下異常,下面是我的代碼:com.googlecode.mp4parser失敗的MP3音頻文件?

閱讀從原始文件夾中的文件:

InputStream is = context.getResources().openRawResource(R.raw.my_mp3_file); 
     OutputStream output = null; 
     try { 
      File file = new File(context.getFilesDir(), "silence.mp3"); 
      if(!file.exists()) { 
       file.createNewFile(); 
      } 
      output = new FileOutputStream(file); 
      byte[] buffer = new byte[4 * 1024]; // or other buffer size 
      int read; 

      while ((read = is.read(buffer)) != -1) { 
       output.write(buffer, 0, read); 
      } 
      output.flush(); 
      output.close(); 
      fileReference= file; 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); // handle exception, define IOException and others 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

代碼讀取電影(這是失敗的):

if(fileReference.exists()) { 
        Movie m = new MovieCreator().build(fileReference.getAbsolutePath()); 
       } 

雖然得到這Movie m我的代碼失敗拋出異常:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.coremedia.iso.boxes.MovieBox.getBoxes(java.lang.Class)' on a null object reference 

它適用於一些MP3文件失敗的原始資源文件?這裏有什麼問題?

+0

找到任何解決辦法? –

回答

0

這裏是我的結論和解決了大量的研究 MP4Parser後用於合併的音頻和視頻只用.m4a的擴展

String root = Environment.getExternalStorageDirectory().toString(); 
      String audio = root + "/" + "tests.m4a"; 
      String video = root + "/" + "output.mp4"; 
      String output = root + "/" + "aud_vid.mp4"; 
      mux(video, audio, output); 

這裏是方法

public boolean mux(String videoFile, String audioFile, String outputFile) { 
    Movie video; 
    try { 
     video = new MovieCreator().build(videoFile); 
    } catch (RuntimeException e) { 
     e.printStackTrace(); 
     return false; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 

    Movie audio; 
    try { 
     audio = new MovieCreator().build(audioFile); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
     return false; 
    } 

    Track audioTrack = audio.getTracks().get(0); 
    video.addTrack(audioTrack); 

    Container out = new DefaultMp4Builder().build(video); 

    FileOutputStream fos; 
    try { 
     fos = new FileOutputStream(outputFile); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     return false; 
    } 
    BufferedWritableFileByteChannel byteBufferByteChannel = new BufferedWritableFileByteChannel(fos); 
    try { 
     out.writeContainer(byteBufferByteChannel); 
     byteBufferByteChannel.close(); 
     fos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
    return true; 
} 

private static class BufferedWritableFileByteChannel implements WritableByteChannel { 
    private static final int BUFFER_CAPACITY = 1000000; 

    private boolean isOpen = true; 
    private final OutputStream outputStream; 
    private final ByteBuffer byteBuffer; 
    private final byte[] rawBuffer = new byte[BUFFER_CAPACITY]; 

    private BufferedWritableFileByteChannel(OutputStream outputStream) { 
     this.outputStream = outputStream; 
     this.byteBuffer = ByteBuffer.wrap(rawBuffer); 
    } 

    @Override 
    public int write(ByteBuffer inputBuffer) throws IOException { 
     int inputBytes = inputBuffer.remaining(); 

     if (inputBytes > byteBuffer.remaining()) { 
      dumpToFile(); 
      byteBuffer.clear(); 

      if (inputBytes > byteBuffer.remaining()) { 
       throw new BufferOverflowException(); 
      } 
     } 

     byteBuffer.put(inputBuffer); 

     return inputBytes; 
    } 

    @Override 
    public boolean isOpen() { 
     return isOpen; 
    } 

    @Override 
    public void close() throws IOException { 
     dumpToFile(); 
     isOpen = false; 
    } 

    private void dumpToFile() { 
     try { 
      outputStream.write(rawBuffer, 0, byteBuffer.position()); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
}