Для этого вы можете использовать библиотеку под названием FFMPEG Android. Она принимает параметры в качестве командных строк и обрабатывает любые видео и аудио.Возможно, вам придется просмотреть некоторую документацию по FFMPEG android. Я использовал эту библиотеку, чтобы добавить водяные знаки к видео, разбив видео на кадры, а затем добавив к нему водяные знаки.Это действительно хорошо сработало, я также протестировал его, чтобы объединить звук и он помог.
Вот пример кода, который я использовал.
ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
@Override
public void onStart() {
}
@Override
public void onFailure() {
}
@Override
public void onSuccess() {
final String fileP = lipModel.filePath;
String[] cmd = {"-i", lipModel.filePath, "-i", imagePath, "-preset", "ultrafast", "-filter_complex", "[1:v]scale="+width*0.21+":"+height*0.35+" [ovrl],[0:v][ovrl] overlay=x=(main_w-overlay_w):y=(main_h-overlay_h)", outputPath};
try {
// to execute "ffmpeg -version" command you just need to pass "-version"
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {
}
@Override
public void onProgress(String message) {
Log.d(TAG, "onProgress: " + message);
}
@Override
public void onFailure(String message) {
Log.d(TAG, "onFailure: " + message);
}
@Override
public void onSuccess(String message) {
Log.d(TAG, "onSuccess: " + message);
new AsyncDispatcher(new IAsync() {
@Override
public void IOnPreExecute() {
}
@Override
public Object IdoInBackGround(Object... params) {
File file = new File(lipModel.filePath);
if (file.exists()) {
file.delete();
}
lipModel.filePath = outputPath;
lipModel.contentUri = Uri.parse(new File(lipModel.filePath).toString()).toString();
lipSyncSerializedModel.lipSyncMap.put(lipModel.uniqueName, lipModel);
ObjectSerializer.getInstance(getApplicationContext()).serialize(SerTag.LIP_HISTORy, lipSyncSerializedModel);
HomeActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (LipSyncFragment.iOnNewDataAddedRef != null) {
LipSyncFragment.iOnNewDataAddedRef.newDataAdded();
// historyFragment.favModel = favModel;
}
LipsyncHistoryFragment lipHistory = new LipsyncHistoryFragment();
File file = new File(fileP);
if (file != null) {
if(file.exists()){
file.delete();
Log.d(TAG, "run: Deleted the Orignal Video");
}
}
new FragmentUtils(HomeActivity.this,
lipHistory, R.id.fragContainer);
}
});
return null;
}
@Override
public void IOnPostExecute(Object result) {
}
});
}
@Override
public void onFinish() {
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
// Handle if FFmpeg is already running
e.printStackTrace();
}
FFMPEG Documentation Link: http://writingminds.github.io/ffmpeg-android-java/
Библиотека FFMPEG: https://github.com/writingminds/ffmpeg-android-java
Есть еще одна библиотека, которая делает то же самое
public class Mp4ParserAudioMuxer implements AudioMuxer {
@Override
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;
}
}
https://github.com/sannies/mp4parser
Вы также можете попробовать это, но она не будетбыть очень простым, вам нужно узнать об этих API
- MediaExtractor , чтобы извлечь данные / трек из файла.
- MediaCodec , если выхотите кодировать / декодировать
- MediaMuxer , чтобы преобразовать его в файл mp4
Вы можете использовать все три из них вместе, если вам нужно, или по отдельности.Вы можете найти пример кода здесь .