2015-01-10 2 views
1

오디오 파일 (사용자가 가지고있는 형식)과 비디오 파일 (mp4)의 위치를 ​​각각 가리키는 두 개의 변수 Uri audioUriUri videoUri이 있습니다. 비디오와 오디오의 길이는 같습니다.비디오의 사운드 트랙을 동일한 길이의 오디오 파일로 변경하십시오.

비디오 파일과 비디오/프레임이 같지만 오디오 파일을 사운드 트랙으로 사용하는 비디오 파일을 만들고 싶습니다.

+0

['MediaExtractor'] (http://developer.android.com/reference/android/media/MediaExtractor.html) 클래스를 사용하여 비디오 트랙을 추출한 다음 [ 'MediaMuxer'] (https://developer.android.com/reference/android/media/MediaMuxer.html) 클래스? – Michael

+0

@Michael MediaMuxer 클래스가 API 18에 추가되었으며, 내 앱은 API 10+ 용입니다. – stackunderflow

+0

ffmpeg처럼 제 3 자 솔루션을 살펴 봐야 할 것 같습니다. – Michael

답변

2

mp4parser 라이브러리를 사용하게되었습니다. MediaExtractorMediaMuxer 클래스는 각각 API 16과 18에 도입되어 프로젝트에 너무 새로운 클래스입니다.

이 방법의주의 사항은 오디오 소스는 aac 또는 mp3 파일이어야하며 비디오 파일은 mp4 파일이어야한다는 것입니다. 에서 "지금 동기화"버튼을 클릭

열기 Gradle Scripts -> build.gradle (Module: app)을하고 dependencies 블록

compile 'com.googlecode.mp4parser:isoparser:1.0.+' 

의 끝에 추가, 설치하고 다음과 같이 사용할 수 있습니다 안드로이드 Studio 및 Gradle을 사용

이 변경 후 노란색 배너가 나타납니다. 자바 파일 쓰기에서 지금

:

try 
{ 
    H264TrackImpl h264Track = new H264TrackImpl(new FileDataSourceImpl(videoFile); 
    MP3TrackImpl mp3Track = new MP3TrackImpl(new FileDataSourceImpl(audioFile); 
    Movie movie = new Movie(); 
    movie.addTrack(h264Track); 
    movie.addTrack(mp3Track); 
    Container mp4file = new DefaultMp4Builder().build(movie); 
    FileChannel fileChannel = new FileOutputStream(new File(outputFile)).getChannel(); 
    mp4file.writeContainer(fileChannel); 
    fileChannel.close(); 
} 
catch (Exception e) 
{ 
    Toast.makeText(this, "An error occurred: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
} 

사용 Alt + Enter를 도구 가져온 모든 수업을합니다. 나에게는 Movie 클래스에 대해 여러 가지 선택 사항이 있으므로 com.googlecode.mp4parser으로 시작하는 클래스를 선택해야합니다.

예외를 처리하고 자체 설명 문자열 outputFile, audioFilevideoFile을 정의하는 것은 귀하에게 맡깁니다.

관련 문제