Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблема с Runtime.Exec !!!


Автор: Nord2008 3.10.2008, 11:14
Привет всем! У меня проблема--немогу запустить программу на выполнение в Linux из кода Java методом Runtime.Exec! Вот сама команда: 
ffmpeg -i "путь_до_клипа_для_перекодировки_с_!!!пробелами!!!_в_названии" -acodec libfaac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x240 -title X "путь_и_название_клипа_на_выходе_с_!!!пробелами!!!"

Вот оригинал:ffmpeg -i "/home/white/Media/Video/Clips/Akon - Don't matter.avi.mp4" -acodec libfaac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x240 -title X "/home/white/Media/Video/Clips/Akon - Don't matter.avi.coded.mp4"

Эта команда незапускается на выполнение,хотя из консоли в Linux'e всё хорошо работает! Подскажите как запустить её на выполнение,что б всё работало,а то столько дней мучаюсь-и ничего smile smile

Автор: Hroft 3.10.2008, 12:33
Код

            Runtime.getRuntime().exec("cmd /c echo 22332 >> c:\\222.txt");


Скорее всего интерпретатор не указываете (sh, bash)

Автор: Nord2008 3.10.2008, 12:55
Все равно не запускается smile 

Автор: Дрон 3.10.2008, 13:15
Цитата(Nord2008 @  3.10.2008,  12:14 Найти цитируемый пост)
Подскажите как запустить её на выполнение,что б всё работало,а то столько дней мучаюсь-и ничего smile smile

А как ты сейчас её пытаешься запустить?

Автор: Nord2008 3.10.2008, 13:23
Запускаю вот эту строку:
Код

String[] cmd ={"\bin\sh","ffmpeg","-i \"/home/white/Media/Video/Clips/Delain - Frozen.avi\""," -acodec libfaac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x240 -title X "," \"/home/white/Media/Video/Clips/Delain - Frozen.avi.coded.mp4\""}; 

Автор: Krivoy 3.10.2008, 13:28
ИМХО занеси это все в скрипт и выполняй его.

Автор: Nord2008 3.10.2008, 13:32
Цитата

ИМХО занеси это все в скрипт и выполняй его.

а как тогда менять названия и пути к клипам\фильмам?? Парсить и менять каждый раз файл?  smile 

Автор: LSD 3.10.2008, 14:14
Цитата(Nord2008 @  3.10.2008,  14:23 Найти цитируемый пост)
Запускаю вот эту строку:

Ну начнём с того, что эта строка не скомпилируется smile 
И почему путь в Linux ты указываешь через обратный слэш?

И вообще неплохо бы писать с каким кодом завершился запуск, или было исключение и какое, или что написал в stdout/stderr.

Автор: Nord2008 3.10.2008, 14:24
Вот часть программы,отвечающая за запуск:
Код

 Process proc = null;
         String line=null;
        Runtime runtime = Runtime.getRuntime();
        String cmd ="ffmpeg -i '\\home\\white\\Media\\Video\\Clips\\Delain - See Me In Shadow.avi' -acodec libfaac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x240 -title X  '\\home\\white\\Media\\Video\\Clips\\Delain - See Me In Shadow.avi.coded.mp4'"; 
        try {
            proc = runtime.exec(cmd);
       
        }
        catch(Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
            }
          BufferedReader is = new BufferedReader(new InputStreamReader
    (proc.getInputStream()));
    try {
    
    while (proc.exitValue()!= 1 ){
    i++;
    System.out.println(line);
    }
    }
    catch(Exception e) {
    JOptionPane.showMessageDialog(null, e.getMessage());
    }


сейчас пишет: "process hasn't exited"  smile 

Автор: LSD 3.10.2008, 14:27
Уже веселей (по крайней мере слеши заэскейплены smile ).

Но все же почему пути так странно указаны?

Автор: Nord2008 3.10.2008, 14:29
В каком смысле странно?smile

Автор: Дрон 3.10.2008, 14:48
Я бы попробовал вызывать не одной строкой, а массивом, сделав каждый параметр отдельным элементом.
Код
String[] cmd = new String[] { "ffmpeg", "-i", "\\home\\white\\Media\\Video\\Clips\\Delain - See Me In Shadow.avi", "-acodec", "libfaac" и т.д.

По идее так решается проблема с пробелами в путях, но может есть ещё какая-то Linux-специфика, я не знаю.

Автор: Nord2008 3.10.2008, 15:01
блин,извините,но ничего что то неподходит....
Вот код который сейчас запускаю и ничего:
Код

Process proc = null;
Runtime runtime = Runtime.getRuntime();
String[] cmd ={"ffmpeg","-i","\\home\\white\\Media\\Video\\Clips\\Delain-SeeMeInShadow.avi","-acodec","libfaac","-ab","128kb","-vcodec","mpeg4","-b","1200kb","-mbd","2","-flags","+4mv+trell","-aic","2","-cmp","2","-subcmp","2","-s","320x240","-title","X"," \\home\\white\\Media\\Video\\Clips\\Delain-SeeMeInShadow.avi.coded.mp4"}; 
try 
      {
         proc = runtime.exec(cmd);
      }
catch(Exception e) 
     {
         OptionPane.showMessageDialog(null, e.getMessage());
      }
BufferedReader is = new BufferedReader(new InputStreamReader(proc.getInputStream()));
try {    
    while ((line = is.readLine()) != null)
         {
             i++;
             System.out.println(line);
          }
      }
catch(Exception e) 
      {
          JOptionPane.showMessageDialog(null, e.getMessage() + "!!!!!!!!");
       }

Автор: LSD 3.10.2008, 16:17
Цитата(Nord2008 @  3.10.2008,  15:29 Найти цитируемый пост)
В каком смысле странно?

В Linux в качестве разделителя пути используется прямой слэш /, а не обратный \, как у тебя.

Автор: Nord2008 5.10.2008, 18:24
Всё равно не получается так! smile 

Автор: Krivoy 6.10.2008, 08:17
Цитата(Nord2008 @ 3.10.2008,  13:32)
Цитата

ИМХО занеси это все в скрипт и выполняй его.

а как тогда менять названия и пути к клипам\фильмам?? Парсить и менять каждый раз файл?  smile

Пути можно задавать как параметры к запуску и обращаться к ним как $1 $2 и т.д.
У тебя --- String[] cmd ={"ffmpeg","-i", ..... и т.д.   --- не задумывался что выполняться будет ffmpeg-i .... и т.д. - думаю врядли такая команда есть  smile  - если захочешь свой вариант - поставь пробелы.
Образец скрипта:
Код

!#/bin/sh

ffmpeg -i $1 -acodec libfaac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x240 -title X $2



Ну к примеру назевёшь ты его tydysh.sh и соответственно первым параметром запуска первый путь, вторым второй ---

Код

String[] cmd ={"tydysh.sh ", "/home/white/Media/Video/Clips/Delain-SeeMeInShadow.avi ", "/home/white/Media/Video/Clips/Delain-SeeMeInShadow.avi.coded.mp4"];
.......


Еще раз обращаю внимание на пробелы! Ну и на путь до скрипта.

Автор: Nord2008 6.10.2008, 09:23
Спасибо большое! Попробую!(думаю что это выход!smile ) Отпишусь как работает...

Автор: Nord2008 6.10.2008, 10:17
Ещё раз всем СпАсИбО! smile  Но если кто-нибудь знает как сделать не через командный файл--пишите,буду рад предложениям!

Автор: SoulKeeper 6.10.2008, 21:02
На прямую ffmpeg дёргать можно, передавая ему параметры.

Юзали его на проекте. Что у дэвов под виндой, что на сервере под линухом - работало идеально.

Автор: Nord2008 7.10.2008, 19:32
Цитата

На прямую ffmpeg дёргать можно, передавая ему параметры.

Юзали его на проекте. Что у дэвов под виндой, что на сервере под линухом - работало идеально.

Напиши поподробнее как делали! smile 

Автор: SoulKeeper 8.10.2008, 11:20
Код

  private void convertToFlv(File video, File audio) {
    String audioPath = "";
    String i = "";
    String map = "";
    if (audio != null) {
      audioPath = audio.getAbsolutePath();
      i = " -i ";
      map = " -map 0:0 -map 1:0";
    }
    try {
      Runtime.getRuntime().exec(getCodecPath()
                                           + " -i "
                                           + video.getName()
                                           + ".mpg"
                                           + i
                                           + audioPath
                                           + map
                                           + " -f flv -s 320x240 -aspect 4:3 -y "
                                           + video.getAbsolutePath(),
                                       null,
                                       new File(getAttachmentsDirectory()));
    } catch (IOException e) {
      log.warn("Can't convert file to flv", e);
      return;
    }
  }


getCodecPath() возвращает путь к ffmpeg, getAttachmentsDirectory() рабочую папку для нового процесса.

Автор: Nord2008 8.10.2008, 15:48
Спасибо большое за помошь! Но подскажи что-за прогцедура getCodecPath() (если можете,и вас незатруднит распишите её) И ещё вопросик: у вас прога склеивает видеофайл и звуковой в оди flv ?

Автор: SoulKeeper 8.10.2008, 21:28
Да, склеивает.

getCodecPath() возвращает путь к ffmpeg. Берется из конфига, т.к. на линухе и винде разный.

Автор: Nord2008 10.10.2008, 17:53
Привет. Вот мой код:
Код

  File f = new File ("/home/white/Media/Video/Clips/Delain - See Me In Shadow.avi");
  Runtime.getRuntime().exec("/usr/bin/ffmpeg "
                                           + " -i "
                                           + f.getName()
                                           + " -acodec libfaac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x240 -title X "
                                           + f.getAbsolutePath()+ ".mpg",
                                           null,
                                           new File(f.getParent()));
 Можешь подсказать где ошибка?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)