2011-01-04 2 views
0

Я разрабатывал приложение для кодирования видео на сервере и получал проблему с кодированием видео с помощью MEncoder. Этот декодер не работает правильно при запущенном с помощью командной строки сВидеокодирование с помощью сервлета с 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”) ; 

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

ответ

1

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

+0

В этом случае ожидания пользователя не столь критично. Этот процесс будет выполняться автоматически при наличии достаточного количества данных. Предположим, что у вас есть определенное количество пользователей, которым требуется видео низкого или высокого качества, тогда видео будет конвертировано из оригинала в желаемый битрейт и предоставляется пользователям для просмотра или загрузки. В этом случае основной проблемой является сбой по неизвестным причинам приложения Mencoder. – Andrew

0

Причина, по которой он не работает, заключается в том, что 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(); 
Смежные вопросы