Я работаю с Xuggler и пытаюсь создать программу, которая использует кадры, захваченные из видео.
Я нашел этот код: Xuggler: Deocde And Capture Frames
Мне удалось заставить его работать и сохранить нужные кадры.
Теперь я пытаюсь интегрировать его в свою программу с графическим интерфейсом пользователя в отдельном потоке, чтобы все не блокировалось, пока он захватывает кадры. Я просто скопировал все в основном в метод run. Единственные изменения, которые я внес, - это исправление имени файла args. Я жестко запрограммировал его и проверил свою рабочую программу, чтобы убедиться, что это правильный путь.
Теперь, когда я пытаюсь запустить код захвата кадра в собственном потоке Runnable, он дает сбой. Кажется, вылетает в этом разделе при открытии файла:
IContainer container = IContainer.make();
if (container.open(filename, IContainer.Type.READ, null) < 0)
throw new IllegalArgumentException("could not open file: " + filename);
После некоторого исследования сайта Xuggler я посмотрел на открытый метод для файла IContainer здесь: Xuggler: IContainer API open ()
В нем говорится: «Если текущий поток прерывается во время выполнения этого метода блокировки, метод вернет отрицательное значение. «
Он действительно возвращает отрицательное значение перед сбоем, поэтому я подумал, что это может быть моей проблемой. Хотя это единственный дополнительный поток, который в настоящее время работает в моей программе. Моя программа - это всего лишь несколько базовых фреймов и панелей, которые я собираюсь использовать для отображения материала. Затем, после их создания, я пытаюсь запустить поток захвата кадра, который дает сбой.
Я не знаю, как это обойти. Может ли кто-нибудь указать мне правильное направление? Спасибо.
Редактировать:
После того, как я нашел этот пост: Ну, у меня недостаточно репутации, чтобы опубликовать третью ссылку, поэтому ее можно найти в Google: icontainer.open xuggler-users
Я реализовал открытие контейнера, используя другой открытый метод, который требовал формата, и, похоже, он работал.
Теперь он выдает это исключение, когда попадает в этот раздел:
resampler = IVideoResampler.make(
videoCoder.getWidth(), videoCoder.getHeight(), IPixelFormat.Type.BGR24,
videoCoder.getWidth(), videoCoder.getHeight(), videoCoder.getPixelType());
if (resampler == null)
throw new RuntimeException(
"could not create color space resampler for: " + filename);
Я попытался открыть его, установив свой собственный IFormat следующим образом:
IContainerFormat format = IContainerFormat.make();
format.setInputFormat("mp4");
И я попытался использовать null в качестве формата, как говорит API, чтобы класс «угадывал» формат.
Однако оба выдают одно и то же исключение, поэтому я не уверен, что делать дальше. Я все еще ищу.