bytedeco/javacv

FFmpegFrameGrabber casue jvm crash when loading .swf file.

Open

#1.113 geöffnet am 28. Dez. 2018

Auf GitHub ansehen
 (18 Kommentare) (0 Reaktionen) (0 zugewiesene Personen)Java (1.583 Forks)batch import
bughelp wanted

Repository-Metriken

Stars
 (6.985 Stars)
PR-Merge-Metriken
 (Keine gemergten PRs in 30 T)

Beschreibung

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