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