bytedeco/javacv

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

Open

#2.146 aberto em 14 de dez. de 2023

Ver no GitHub
 (2 comments) (0 reactions) (0 assignees)Java (1.583 forks)batch import
help wantedquestion

Métricas do repositório

Stars
 (6.985 stars)
Métricas de merge de PR
 (Nenhuma PRs mesclada em 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?

Guia do colaborador