bytedeco/javacv

FFmpegFrameGrabber casue jvm crash when loading .swf file.

Open

#1,113 opened on Dec 28, 2018

View on GitHub
 (18 comments) (0 reactions) (0 assignees)Java (1,583 forks)batch import
bughelp wanted

Repository metrics

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

Description

I use FFmpegFrameGrabber to get image frame from videos. Everything was fine until I load some .swf file in my app. And the jvm is crash. I already try https://github.com/bytedeco/javacv/issues/1055 https://github.com/bytedeco/javacv/issues/605 but it doesn't work for me.

I use maven to manage my project, and the related javacv config is:

        <!-- JavaCV start -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg</artifactId>
            <version>4.0.2-1.4.3</version>
            <classifier>linux-x86_64</classifier>
        </dependency>
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg</artifactId>
            <version>4.0.2-1.4.3</version>
            <classifier>windows-x86_64</classifier>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.4.3</version>
        </dependency>
        <!-- JavaCV end -->

My system is:Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.78-1 x86_64 GNU/Linux

My java code is:

@Override
public void run() {
    FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(videoPath);
    frameGrabber.setOption("RW_TIMEOUT".toLowerCase(), "3000000");
    frameGrabber.setOption("threads", "1");
    avutil.av_log_set_level(avutil.AV_LOG_ERROR);
    int frameNumber = 0;
    finished = false;
    try {
        frameGrabber.start();
        Frame frame;
        long lastTimeStamp = 0L;
        while ((frame = frameGrabber.grabImage()) != null) {
            long currentTimeStamp = frameGrabber.getTimestamp();
            if ((currentTimeStamp - lastTimeStamp) > screenShotFrequency * 1000000) {
                //Add the frame to a List.
                lastTimeStamp = currentTimeStamp;
            }
        }
        frameGrabber.close();
    } catch (Exception e) {
        log.info("Exception = {}", e);
    } finally {
        //some extra logic
    }
}

And here is a swf file:

Contributor guide