2013-02-16 23 views
2

나는 파일을 분할하기 위해 mencoder을 사용하고 있으며 가능한 경우이를 사용하여 객체 지향 접근 방식으로 바꾸고 싶습니다. 그러나 나는 최선의 방법이 확실하지 않으므로 공개적으로 남겨 둡니다. 다음은 내가 필요한 것입니다.터미널 명령을 반복적으로 호출하는 가장 좋은 방법

시작 시간과 종료 시간이있는 Excel 파일이 있고 비디오 파일에서 적절한 클립을 추출해야합니다. 터미널에서 내가 예를 들어, 사용 성공 했어 (I 맥 OS X에있어) : 비디오 MyVideo.avi의 첫 번째 10 초 클리핑하여 비디오 Output.avi를 생성

mencoder -ss 0 -endpos 10 MyVideo.avi -oac copy -ovc copy -o Output.avi 

합니다.

하지만 내가 말했듯이, 프로그램이 엑셀 파일을 읽어 들이고이 mencoder 명령을 시작 시간과 종료 시간 각각에 대해 여러 번 (100 이상) 호출하려고합니다.

나는 자바로 엑셀 파일을 읽는 법을 알고 있지만, 자바에서이 명령을 호출하는 것이 가장 좋은 것인지 잘 모르겠습니다. 또한, mencoder의 출력을 볼 수 있기를 원합니다 (왜냐하면 좋은 백분율을 출력하므로 단일 명령이 얼마나 오래 걸릴지 알 수 있기 때문입니다). 쉘 스크립트에서 이런 유형의 작업이 가능합니까? 가능하다면 really은 Java를 사용하고 싶습니다. Java에서 수년 간의 경험과 쉘 스크립팅 경험이 없기 때문에 가능합니다.


UPDATE 여기

내가 자바 시도했다, 그러나 내가 mencoders 멀티 코어 기능에 대해 매우 확실하지 않다 in.readLine()

 File wd = new File("/bin"); 
     System.out.println(wd); 
     Process proc = null; 
     try { 
      proc = Runtime.getRuntime().exec("/bin/bash", null, wd); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     if (proc != null) { 
      BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
      PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true); 
      out.println("cd .."); 
      out.println("pwd"); 
      String video = "/Users/MyFolder/MyFile.avi"; 
      String output = "/Users/MyFolder/output.avi"; 
      int start = 0; 
      int end = 6; 
      String cmd = "mencoder -ss " + start + 
          " -endpos " + end + 
          " " + video + " -oac copy -ovc copy -o " + output; 

      out.println(cmd); 
      try { 
       String line; 
       System.out.println("top"); 
       while ((line = in.readLine()) != null) { 

       System.out.println(line); 
       } 
       System.out.println("end"); 
       proc.waitFor(); 
       in.close(); 
       out.close(); 
       proc.destroy(); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
+0

아,이 작업에는 충분하지 않은 프로세스입니까? – giorashc

+0

자바에서 성공하지 못했습니다. – CodeGuy

+0

안녕하세요 @ 코드가 왜 입력 스트림을 사용하고 출력 스트림을 사용하지 않으십니까? 내 말은 출력을보고 입력 스트림이 입력을 기다릴 것이므로 루프가 끝나지 않는 이유를 생각할 것입니다. – giorashc

답변

0

에서 정지하지만 Java로 생각하면 다중 스레드를 사용하여 모든 CPU 코어의 최대 성능을 얻을 수 있습니다.

런타임처럼 사용해서는 안됩니다.

런타임을 사용하는 경우 터미널에서 명령을 입력 할 때와 같이 입력 스트림을 통해 bash 및 send 명령을 실행하면 안됩니다.

Runtime.getRuntime() 간부 (+ 출력 "-o -ovc 복사본을 복사 -oac"mencoder -ss "+ 시작 + "-endpos "+ 단부 +" "+ + 비디오").;

는 출력을 얻으려면, 당신은 또한 당신의 명령이 실행되는 WORKINGDIRECTORY을 설정할 수 있습니다이 명령을 InputStream 인에게

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String,%20java.lang.String[],%20java.io.File%29

를 사용할 수 있습니다.

또한 매개 변수로 String []이있는 버전을 선호합니다. 그것은 연결 문자열보다 훨씬 더 읽기 쉽습니다.

관련 문제