bytedeco / javacv

Java interface to OpenCV, FFmpeg, and more
Other
7.51k stars 1.58k forks source link

When I use the filter to set the video to have multiple paths, the resulting video turned into three identical images of the filter effect #1984

Closed zxyFalcon closed 1 year ago

zxyFalcon commented 1 year ago

When I use the filter to set the video to have multiple paths, for example "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip[flip]; [main][flip] overlay=0:H/2" or "[0:v]scale=iw/2:ih/2[a];[1:v][a]overlay=30:30[v]", the resulting video turned into three identical images of the filter effect

![Uploading 20230214113858.png…]()

My code is as follows:

public void test() throws IOException {

    String filterStr = "[0:v]scale=iw/2:ih/2[a];[1:v][a]overlay=30:30[v]";

    FFmpegFrameGrabber stream0 = new FFmpegFrameGrabber(new File("test0.mp4"));
    FFmpegFrameGrabber stream1 = new FFmpegFrameGrabber(new File("test1.mp4"));
    stream0.start();
    stream1.start();

    FFmpegFrameFilter filter = new FFmpegFrameFilter(filterStr, stream0.getImageWidth(), stream0.getImageHeight());
    filter.setVideoInputs(2);
    filter.start();

    FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(new File("test.mp4"),
        stream0.getImageWidth(), stream0.getImageHeight());
    recorder.setFormat("mp4");
    recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
    recorder.start();

    int idx = 0;
    Frame frame0, frame1, frame;
    while ((frame0 = stream0.grabImage()) != null && (frame1 = stream1.grabImage()) != null) {
        filter.push(0, frame0);
        filter.push(1, frame1);
        frame = filter.pullImage();
        if (frame != null && frame.image != null) {
            recorder.record(frame);
        }
    }
    recorder.close();
    filter.close();
    stream0.close();
    stream1.close();
}
saudet commented 1 year ago

Please try to call recorder.record(frame, filter.getPixelFormat()) instead of recorder.record(frame).

zxyFalcon commented 1 year ago

@saudet Thank you!!!