2015-07-04 2 views
1

Я использую mp4parser для объединения аудио и видео файлов, вот ниже пример, который я пробовал, но я получаю исключение нулевого указателя на самой первой строке. Я сохранил аудио и видео файлы в нужном месте в моей внутренней памяти телефона. если я отладка, первая строка займет много времени & просто останавливают после минут с ошибкой нулевого указателяобъединить аудио и видео файл в android

try 
{ 
      H264TrackImpl h264Track = new H264TrackImpl(new FileDataSourceImpl("/mnt/sdcard/myvideo/video.mp4")); 
      AACTrackImpl aacTrack = new AACTrackImpl(new FileDataSourceImpl("/mnt/sdcard/myvideo/audio.acc")); 

      Movie movie = new Movie(); 
      movie.addTrack(h264Track); 
      movie.addTrack(aacTrack); 


      Container mp4file = new DefaultMp4Builder().build(movie); 

      FileChannel fc = new FileOutputStream(new File("output.mp4")).getChannel(); 
      mp4file.writeContainer(fc); 
      fc.close(); 

     } catch (Exception ee) 
     { 
      Toast.makeText(this,ee.getMessage(),Toast.LENGTH_LONG).show(); 
     } 

что случились в моем коде выше?

ответ

1

** Попытайтесь это У меня есть несколько вещей, чтобы объединить аудио и видео.

  • 1) Захват видео Blank Dont использовать любой источник звука, как "mediaRecorder.setAudioSource (MediaRecorder.AudioSource.VOICE_RECOGNITION);"
  • 2) сохранить его на SD-карте
  • 3) он не поддерживает MIME-тип = mp3.
  • 4) так что если нам нужно объединить видео и видео. звук должен быть mp4 или ААС **

5) вызовите метод кнопкой мыши или на Крите

  • Строка аудиотракта = "/sdcard/audio.m4a".

  • String videopath = "/sdcard/video.mp4";

  • String outputpath = "/sdcard/output.mp4";

  • мультиплексор (видео, аудио, выход);

6) Основной код здесь передать его единственный путь, где вы храните ваши видео, аудио (M4A, AAC), Выходной путь.

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(); 
     Log.e("Audio Video", "11"); 
     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 static final int BUFFER_CAPACITY = 10000000; 

    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); 
     Log.e("Audio Video", "13"); 
    } 

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

     if (inputBytes > byteBuffer.remaining()) { 
      Log.e("Size ok ", "song size is ok"); 
      dumpToFile(); 
      byteBuffer.clear(); 

      if (inputBytes > byteBuffer.remaining()) { 
       Log.e("Size ok ", "song size is not okssss ok"); 
       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); 
     } 
    } 
} 
Смежные вопросы