bytedeco/javacv

I use fps filter, there are problems with sound

Open

#1,885 opened on Sep 6, 2022

View on GitHub
 (17 comments) (0 reactions) (0 assignees)Java (1,583 forks)batch import
enhancementhelp wantedquestion

Repository metrics

Stars
 (6,985 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

The sound goes well for about 100 seconds and then breaks off.

    FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("file.mkv");
    grabber.start();

    FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("rtmp://live-fra.twitch.tv/app/live_", 1920, 1080, 2);
    recorder.setInterleaved(true);
    recorder.setVideoOption("tune", "zerolatency");
    recorder.setVideoOption("preset", "veryfast");
    recorder.setVideoOption("crf", "24");
    recorder.setVideoOption("threads", "2");
    recorder.setVideoBitrate(4_000_000);
    recorder.setPixelFormat(AV_PIX_FMT_YUV420P);
    recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
    recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
    recorder.setFrameRate(30);
    recorder.setGopSize(60);
    recorder.setAudioQuality(0);
    recorder.setAudioBitrate(grabber.getAudioBitrate());
    recorder.setSampleRate(grabber.getSampleRate());
    recorder.setAudioChannels(grabber.getAudioChannels());
    recorder.setFormat("flv");
    recorder.start();

    String scale = recorder.getImageWidth() + ":" + recorder.getImageHeight();
    FFmpegFrameFilter filter = new FFmpegFrameFilter("fps=fps=30,scale=" + scale + ":force_original_aspect_ratio=1,pad=" + scale + ":(ow-iw)/2:(oh-ih)/2", "volume=2.5", grabber.getImageWidth(), grabber.getImageHeight(), 2);
    filter.setAudioChannels(grabber.getAudioChannels());
    filter.setSampleFormat(grabber.getSampleFormat());
    filter.setSampleRate(grabber.getSampleRate());
    filter.setFrameRate(grabber.getFrameRate());
    filter.start();

    grabber.setVideoFrameNumber(10000);
    grabber.setAudioFrameNumber(10000);

    FPSCounter fpsCounter = new FPSCounter(fps -> System.out.println("Frame Rate Push - " + fps));

    while (true) {
        Frame grab = grabber.grabFrame(true, true, true, false, false);
        if (grab != null) {
            filter.push(grab);
            Frame frame = filter.pull();
            if (frame != null) {
                recorder.record(frame);
            }
            fpsCounter.render();
        }
    }

Contributor guide