2015-07-12 2 views
0

Я хочу сделать дублирующее приложение в Android. Поток приложения:Как дублировать видео со звуком в android

  1. Получить видео и аудио из галереи.
  2. Уменьшить исходный звук видеофайла. И смешайте (Dub) выбранный звук в этом видеофайле.
  3. После микширования звука в этом видеофайле сохраните его во внешнюю память.

Я использую MediaMuxer для этого, но не безуспешно. Пожалуйста, помогите мне в этом.

С уважением, Prateek

ответ

0

даже я искал то же самое, чтобы перезаписать мое видео с аудио с помощью mediaMuxer, MediaMuxer было немного трудно концепция для меня, чтобы понять, как я новичок. Я закончил тем, что ссылался на этот код github. https://github.com/tqnst/MP4ParserMergeAudioVideo Это был мой спаситель. на самом деле thanx для этого человека. Я только что взял код, который мне нужен, то есть переписывать видео со звуком, который я указываю.

вот мой код я использовал в моем проекте ниже

private void mergeAudioVideo(String originalVideoPath,String AudioPath,String OutPutVideoPath) { 
    // TODO Auto-generated method stub 
    Movie video = null; 
    try { 
     new MovieCreator(); 
     video = MovieCreator.build(originalVideoPath); 
    } catch (RuntimeException e) { 
     e.printStackTrace(); 

    } catch (IOException e) { 
     e.printStackTrace(); 

    } 

    Movie audio = null; 
    try { 
     new MovieCreator(); 
     audio = MovieCreator.build(AudioPath); 
    } catch (IOException e) { 
     e.printStackTrace(); 

    } catch (NullPointerException e) { 
     e.printStackTrace(); 

    } 
    List<Track> videoTracks = new LinkedList<Track>(); 
    for (Track t : video.getTracks()) { 
     if (t.getHandler().equals("vide")) { 
      videoTracks.add(t); 
     //seperate the video from the orginal video 
     } 
    } 
    Track audioTrack = audio.getTracks().get(0);// get your audio track to dub the video 
    Movie result = new Movie(); 
    result.addTrack(videoTracks.get(0)); // add the video seprated from the originals 
    result.addTrack(audioTrack); //add the track to be put in resul video 

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

    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(OutPutVideoPath); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    BufferedWritableFileByteChannel byteBufferByteChannel = new BufferedWritableFileByteChannel(fos); 
    try { 
     out.writeContainer(byteBufferByteChannel); 
     byteBufferByteChannel.close(); 
     fos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

и вот класс BufferedWritableFileByteChannel для записи данных outputVideo в каталог.

public 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]; 

public 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); 
    } 
    } 
} 

и не забудьте добавить библиотеки в свой проект.

Это не может быть точный ответ на ваш вопрос. но, по крайней мере, он сможет пролить свет на вероятное решение.

Смежные вопросы