Hello everybody!
I need to concatenate a multiple video and merge it with audio. So, I did it, but another one problem is to set effect for video and audio.
Can anyone tell me, how to create fade-in and fade-out effects for video and audio?
The code below is how I'm releasing multiple concatenation and audio merging.
I'm hope very much for your help and would really appreciate for that!
public class MultipleVideoConcatenation {
Context context;
private String resultFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
DataManager.getInstance().getAuthorizationData().getUserId() + "/ResultVideoFile/ResultVideoFile.mp4";
private String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
DataManager.getInstance().getAuthorizationData().getUserId() + "/VideoPieces";
private String startBumper = Environment.getExternalStorageDirectory().getAbsolutePath() + "/start_bumper.mp4";
private String endBumper = Environment.getExternalStorageDirectory().getAbsolutePath() + "/end_bumper.mp4";
private String sourceAudio = Environment.getExternalStorageDirectory().getAbsolutePath() + "/sound1.mp3";
List<File> treeCollection;
long timeStamp = 0, tsStartBumper = 0, tsEndBumper = 0, tsPieces = 0, timeStampAudio = 0;
public MultipleVideoConcatenation(){}
public MultipleVideoConcatenation(Context context){
this.context = context;
}
public void concatenate(){
try{
File parentDirectory = new File(path);
treeCollection = getListFiles(parentDirectory);
List<FrameGrabber> frameGrabbers = new ArrayList<FrameGrabber>();
for (File ff : treeCollection) {
FrameGrabber grabber = new FFmpegFrameGrabber(ff);
grabber.setAudioChannels(2);
grabber.start();
frameGrabbers.add(grabber);
}
File startBumperFile = new File(startBumper);
File endBumperFile = new File(endBumper);
File audioFile = new File(sourceAudio);
FrameGrabber startBumperGrabber = new FFmpegFrameGrabber(startBumperFile);
startBumperGrabber.start();
FrameGrabber endBumperGrabber = new FFmpegFrameGrabber(endBumperFile);
endBumperGrabber.start();
FFmpegFrameGrabber audioGrabber = new FFmpegFrameGrabber(audioFile);
audioGrabber.setAudioChannels(2);
audioGrabber.start();
FrameRecorder recorder = new FFmpegFrameRecorder(resultFile, frameGrabbers.get(0).getImageWidth(), frameGrabbers.get(0).getImageHeight(), 2);
recorder.setVideoQuality(0);
recorder.setVideoCodec(13);
recorder.start();
Frame frame;
int k = 0;
while ((frame = startBumperGrabber.grabFrame()) != null) {
if(frame.image != null) {
recorder.record(frame);
}
tsStartBumper = startBumperGrabber.getTimestamp();
Log.i("LOG FOR", "START WRITING BUMPER");
}
timeStamp += tsStartBumper;
startBumperGrabber.stop();
for (FrameGrabber fg : frameGrabbers) {
while ((frame = fg.grabFrame()) != null) {
if(frame.image != null) {
recorder.record(frame);
}
tsPieces = fg.getTimestamp();
Log.i("LOG FOR", String.valueOf(k));
}
k++;
timeStamp += tsPieces;
if (k == frameGrabbers.size()) {
fg.stop();
Log.i("LOG FOR", "STOP");
}
}
while ((frame = endBumperGrabber.grabFrame()) != null) {
if(frame.image != null) {
recorder.record(frame);
}
tsEndBumper = endBumperGrabber.getTimestamp();
Log.i("LOG FOR", "START WRITING BUMPER");
}
endBumperGrabber.stop();
timeStamp += tsEndBumper - 2000000;
for(int j = 0; timeStampAudio <= timeStamp; j++){
frame = audioGrabber.grabFrame();
if(frame == null){
break;
}
frame.image = null;
timeStampAudio = audioGrabber.getTimestamp();
recorder.setTimestamp(timeStampAudio);
recorder.record(frame);
Log.i("LOG FOR", "Audio-Video merging22222222");
}
recorder.stop();
recorder.release();
audioGrabber.stop();
Log.i("LOG FOR", "STOP");
} catch (FrameGrabber.Exception | FrameRecorder.Exception e) {
e.printStackTrace();
}
}
public List<File> getListFiles(File parentDirectory){
ArrayList<File> inFiles = new ArrayList<File>();
File[] files = parentDirectory.listFiles();
for(File file : files){
if(!file.isDirectory()) {
inFiles.add(file);
}
else{
inFiles.addAll(getListFiles(file));
}
}
return inFiles;
}
}