Bytedeco.javacv.Проблема FFmpegFrameGrabber

#java #opencv #image-processing #video-processing #javacv

Вопрос:

Я использую следующий метод, чтобы получить массив кадров, которые я могу использовать в других частях программы. Но я сталкиваюсь с ошибкой OutOfMemoryError.Но я сталкиваюсь с ошибкой OutOfMemoryError. Есть ли способ, которым я могу это сделать?

  public  Frame[] grabFrame(String videoPath) throws FFmpegFrameGrabber.Exception
    {
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath);
        grabber.start();
        
       
        final Frame[] frames = new Frame[grabber.getLengthInFrames()];
        int flag = 0;
        int index =0;
        Frame frame = null;
        while (flag < frames.length)
        {
             frame = grabber.grab().clone();
            
            


            if(frame!=null)
            {

                frames[index] = frame.clone();
                index  ;

            }
            flag  ;
        }
        
        
        grabber.stop();
        grabber.release();
        return frames;
    }
 

выход:

Исключение в потоке «основной» java.lang.Ошибка памяти: Не удается выделить новый байт-указатель(6174720): Всего байтов = 2014М, физических байтов = 2155М

Комментарии:

1. Очевидное решение: не пытайтесь декодировать и сохранять в памяти все кадры видео сразу. Вместо этого обрабатывайте каждый кадр или фиксированное количество кадров за раз. Наконец, вам, вероятно, следует clone() использовать кадр только один раз, чтобы избежать потери памяти/дополнительной нагрузки на GC. 😀Если вам по какой-то причине необходимо сохранить все декодированные кадры в памяти, единственный другой вариант — выделить больше памяти для процесса Java…

Ответ №1:

Вам нужно где-то хранить свои кадры, потому что ваше приложение не может хранить их все в памяти.

Вы можете использовать относительно временную базу данных, такую как Redis, в зависимости от вашего варианта использования. Трудно сказать, не понимая, что вам нужно делать с данными, которые вы потребляете.

Комментарии:

1. Моя цель-сделать редактор фильмов. Для этого мне нужно иметь формы в памяти, одновременно отображать и обрабатывать их для пользователя. Чтобы пользователь мог перемещаться между кадрами и вносить нужные изменения. И мне нужно сделать это быстро. Можно ли это сделать с помощью временной базы данных?