Кодирование видео сервлетом с помощью MEncoder - PullRequest
0 голосов
/ 05 января 2011

Я разрабатывал приложение для кодирования видео на сервере, и у меня возникла проблема с кодированием видео с помощью MEncoder.Этот декодер не работает правильно при запуске из командной строки с

Runtime.getRuntime().exec(“D:\mencoder\mnc\mencoder.exe  video1.avi -o outvideo1.flv -of lavf -oac mp3lame -lameopts abr:br=64 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240,harddup -quiet”) ;

Декодер запускается и работает в консоли Windows с моими параметрами, но когда он запускается из сервлета, он просто висит в списке процессовничего не делать до остановки веб-сервера.При попытке использовать декодер из простого приложения Java, он работает правильно.Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 05 января 2011

Это определенно плохой способ сделать это.В общем, mencoder займет намного больше времени, чем пользователи будут готовы ждать.Кроме того, если mencoder теряет память или вылетает, вы рискуете уничтожить весь jvm.Вы также не можете контролировать, сколько из этих процессов появилось.Лучшее решение - иметь очередь jms или базу данных, в которую вы вставляете.Затем у вас есть другое пакетное задание, которое собирает и обрабатывает эти видео.Если вы используете подход с базой данных, вы можете обновлять базу данных по мере развития событий и поддерживать пользователя в курсе статистики прогресса.Как правило, не допускайте такого выполнения во время выполнения из контейнера веб-приложения.

0 голосов
/ 13 мая 2013

Причина, по которой это не работает, заключается в том, что MPlayer выводит много материала в терминал, и как только его вывод достигает 4096 байт (ограничение буфера канала в Linux), процесс зависает на следующем printf, пока некоторые данные не будут считаны другая сторона трубы. И в вашем случае он зависает навсегда, поскольку вы не читаете стандартный вывод и потоки ошибок.
Чтобы обойти это, вы можете просто закрыть эти потоки, как только запустите процесс:

Process p = Runtime.getRuntime().exec(“D:\mencoder\mnc\mencoder.exe  video1.avi -o outvideo1.flv -of lavf -oac mp3lame -lameopts abr:br=64 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240,harddup -quiet”) ;
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...