Xuggler: захват видеокадров в отдельном потоке

Я работаю с 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, чтобы класс «угадывал» формат.

Однако оба выдают одно и то же исключение, поэтому я не уверен, что делать дальше. Я все еще ищу.


person Lucas    schedule 07.04.2013    source источник


Ответы (1)


Возможно, вам следует использовать ExecutorService для обработки пул потоков.

person AsirC    schedule 07.04.2013
comment
На данный момент это только один поток, но я тоже пробовал это. Он все равно вылетает, когда ему надоедает открывать контейнер и выходить с отрицательным результатом. - person Lucas; 07.04.2013