bytedeco/javacv
View on GitHubcolor loss and image duplication when using xfade to merge two videos.
Open
#2,146 opened on Dec 14, 2023
help wantedquestion
Repository metrics
- Stars
- (6,985 stars)
- PR merge metrics
- (No merged PRs in 30d)
Description
my platform version is:
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.9</version>
</dependency>
my code is as follow (i learned from #1776 ):
public static void main(String[] args) throws FFmpegFrameGrabber.Exception, FFmpegFrameRecorder.Exception, FFmpegFrameFilter.Exception {
String out = "/home/hxl/vlogdemo/" + new SimpleDateFormat("MMdd-HHmmss'.mp4'").format(new Date());
String inputFilePath = "/home/hxl/vlogdemo/1.mp4";
String inputFilePath2 = "/home/hxl/vlogdemo/2.mp4";
FFmpegLogCallback.set();
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFilePath);
grabber.start();
FFmpegFrameGrabber grabber2 = new FFmpegFrameGrabber(inputFilePath2);
grabber2.start();
FFmpegFrameFilter filter = new FFmpegFrameFilter(
"[0:v][1:v]xfade=transition=wipeleft:offset=5s:duration=2[v]",
grabber.getImageWidth(), grabber.getImageHeight());
filter.setPixelFormat(grabber.getPixelFormat());
filter.setSampleFormat(grabber.getSampleFormat());
filter.setVideoInputs(2);
filter.setImageHeight(grabber.getImageHeight());
filter.setImageWidth(grabber.getImageWidth());
filter.start();
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(out, grabber.getImageWidth(), grabber.getImageHeight());
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("mp4");
recorder.setAudioBitrate(grabber.getAudioBitrate());
recorder.setVideoBitrate(grabber.getVideoBitrate());
recorder.setFrameRate(grabber.getFrameRate());
recorder.setAudioChannels(grabber.getAudioChannels());
recorder.setSampleRate(grabber.getSampleRate());
recorder.start();
Frame frame1, frame2, frame;
while ((frame1 = grabber.grabImage()) != null && (frame2 = grabber2.grabImage()) != null) {
filter.push(0, frame1);
filter.push(1, frame2);
frame = filter.pullImage();
if (frame != null && frame.image != null) {
recorder.record(frame);
}
}
grabber.stop();
grabber2.stop();
filter.stop();
recorder.stop();
System.out.println("finish");
}
and the output video is like this:
my first video:
and my second video:
why does color lose?and why dose image duplicated?