bytedeco/javacv

color loss and image duplication when using xfade to merge two videos.

Open

#2,146 opened on Dec 14, 2023

View on GitHub
 (2 comments) (0 reactions) (0 assignees)Java (1,583 forks)batch import
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: image my first video: image and my second video: image

why does color lose?and why dose image duplicated?

Contributor guide