bytedeco/javacv

Raspberry Pi 5 with modern video stack and PiCamera

Open

#2.221 aberto em 23 de abr. de 2024

Ver no GitHub
 (4 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

After hours and hours of testing the following code is my working result, using a Raspberry Pi 5 with the modern video stack and a PiCamera.

My question: Is there a more elegant way dealing with the RPi 5 + PiCamera?

package l9g.javacv.demo2;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import static org.bytedeco.ffmpeg.global.avutil.AV_PIX_FMT_BGR24;
import org.bytedeco.javacv.*;

/**
 *
 * @author Thorsten Ludewig (t.ludewig@gmail.com)
 */
public class JavacvDemo2
{
  private final static String VIDEO_STREAM_URL = "udp://0.0.0.0:9595";

  private final static String VIDEO_CODEC = "mjpeg";

  private final static double VIDEO_FRAMERATE = 15.0;

  private final static int VIDEO_WIDTH = 640;

  private final static int VIDEO_HEIGHT = 480;

  private static Process libcameraProcess;

  public static void main(String[] args) throws Exception
  {
    ProcessBuilder builder = new ProcessBuilder();
    builder.inheritIO();
    builder.command(
      "/usr/bin/libcamera-vid", "-n", "-t", "0",
      "--framerate", Double.toString(VIDEO_FRAMERATE),
      "--width", Integer.toString(VIDEO_WIDTH),
      "--height", Integer.toString(VIDEO_HEIGHT),
      "--codec", VIDEO_CODEC, "-o", VIDEO_STREAM_URL
    );
    libcameraProcess = builder.start();

    System.out.println("libcamera-vid started waiting 3s");
    Thread.sleep(3000);
    System.out.println("setup ffmpeg log callback");

    FFmpegLogCallback.set();
    FFmpegLogCallback.setLevel(0);

    System.out.println("initialize ffmpeg grabber");
    FrameGrabber grabber = new FFmpegFrameGrabber(VIDEO_STREAM_URL);
    grabber.setFrameNumber(1);
    grabber.setFrameRate(VIDEO_FRAMERATE);
    grabber.setFormat(VIDEO_CODEC);
    grabber.setPixelFormat(AV_PIX_FMT_BGR24);

    System.out.println("starting ffmpeg grabber");
    grabber.start();

    System.out.println("setup canvas");
    CanvasFrame frame = new CanvasFrame("Raspberry Pi Camera");

    frame.addWindowListener(new WindowAdapter()
    {
      @Override
      public void windowClosing(WindowEvent e)
      {
        System.out.println("exit application");
        libcameraProcess.destroy();
        System.exit(0);
      }
    });

    frame.setSize(VIDEO_WIDTH, VIDEO_HEIGHT);
    frame.setVisible(true);

    while (true)
    {
      var image = grabber.grab();
      if (image != null)
      {
        frame.showImage(image);
      }
    }
  }
}

Guia do colaborador