2012-09-07 4 views
1

저는 Raspberry Pi 용 Java 프로젝트를 작업 중이며 런타임이 올바르게 작동하는 데 도움이 필요합니다. 내 iMac의 코드를 작성하는 동안 스크립트를 조금 수정Java Runtime.getRuntime(). exec(). youtube2mp3

:

youtube2mp3 무비-DL와는 FFmpeg (http://jeffreyv.hubpages.com/hub/Youtube-to-MP3-on-Ubuntu-Linux INFO) : 사용 다음

x=youtube-dl-$RANDOM-$RANDOM.flv 
youtube-dl --output=$x --format=18 "$1" 
ffmpeg -i $x -acodec libmp3lame -ac 2 -ab 128k -vn -y "$2" 
mv "$2" ~/Downloads 
rm $x 
rm *.mp4 

을 나는 피곤 내 서블릿을 호출 다운로드를 시작하려면

명령이 실행될 때 매우 자세한 정보를 표시하지만 스캐너 개체가 아무 것도 인식하지 못합니다. 이 코드를 서블릿에두고 스레드를 사용하여 시도했지만 두 번 실패했습니다.

실행하고 이미 관리자의 암호를

나는 (나는() 런타임을 사용하여 이전 프로그램의 ARP 검사를 실행 해요)이 필요하지의 sudoers 파일로 변경 sudo는 필요하지 않습니다 명령 "명령"이 출력하고 잘 실행되는 터미널에 규칙을 복사하여 붙여 넣을 수 있습니다.

도움을 주시면 감사하겠습니다. 프로세스 수준의 문서에서

sudo /usr/local/bin/youtube2mp3 "http://www.youtube.com/watch?v=X_tbksFYhl4" "test-none.mp3" 
[youtube] Setting language 
[youtube] X_tbksFYhl4: Downloading video webpage 
[youtube] X_tbksFYhl4: Downloading video info webpage 
[youtube] X_tbksFYhl4: Extracting video information 
[download] Destination: youtube-dl-7433-2196.flv 
[download] 100.0% of 39.17M at 1.83M/s ETA 00:00 
ffmpeg version 0.11.1 Copyright (c) 2000-2012 the FFmpeg developers 
built on Sep 6 2012 13:52:52 with clang 4.0 ((tags/Apple/clang-421.0.60)) 
configuration: --prefix=/usr/local/Cellar/ffmpeg/0.11.1 --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid 
libavutil  51. 54.100/51. 54.100 
libavcodec  54. 23.100/54. 23.100 
libavformat 54. 6.100/54. 6.100 
libavdevice 54. 0.100/54. 0.100 
libavfilter  2. 77.100/2. 77.100 
libswscale  2. 1.100/2. 1.100 
libswresample 0. 15.100/0. 15.100 
libpostproc 52. 0.100/52. 0.100 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'youtube-dl-7433-2196.flv': 
Metadata: 
major_brand  : mp42 
minor_version : 0 
compatible_brands: isomavc1mp42 
creation_time : 2010-01-17 00:16:32 
Duration: 00:09:59.23, start: 0.000000, bitrate: 548 kb/s 
Stream #0:0(und): Audio: aac (mp4a/0x6134706D), 44100 Hz, stereo, s16, 113 kb/s 
Metadata: 
    creation_time : 2010-01-17 00:16:32 
    handler_name : (C) 2007 Google Inc. v08.13.2007. 
Stream #0:1(und): Video: h264 (Constrained Baseline) (avc1/0x31637661), yuv420p, 480x270 [SAR 1:1 DAR 16:9], 432 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc 
Metadata: 
    creation_time : 2010-01-17 00:16:33 
    handler_name : (C) 2007 Google Inc. v08.13.2007. 
Output #0, mp3, to 'test-none.mp3': 
Metadata: 
major_brand  : mp42 
minor_version : 0 
compatible_brands: isomavc1mp42 
TDEN   : 2010-01-17 00:16:32 
TSSE   : Lavf54.6.100 
Stream #0:0(und): Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s 
Metadata: 
    creation_time : 2010-01-17 00:16:32 
    handler_name : (C) 2007 Google Inc. v08.13.2007. 
Stream mapping: 
Stream #0:0 -> #0:0 (aac -> libmp3lame) 
Press [q] to stop, [?] for help 
size= 9364kB time=00:09:59.22 bitrate= 128.0kbits/s  
video:0kB audio:9363kB global headers:0kB muxing overhead 0.006039% 
rm: *.mp4: No such file or directory 
+0

표준 출력을 읽으려고하기 전에 프로세스가 끝날 때까지 기다리는 이유는 무엇입니까? –

+0

나는 모든 것을 포착했는지 확인하고 싶었습니다. arp-scan으로 모든 Mac Addresses 및/또는 오류가 있는지 확인하기 위해 동일한 작업을 수행했습니다. 이로 인해 문제가 발생하지 않아야합니다. – Ctcoggin

답변

1

: 몇 가지 기본 플랫폼은 표준 입력 및 출력 스트림에 대한 제한 버퍼 크기를 제공하기 때문에 여기에 UPDATE

는 youtube2mp3 명령을 실행의 출력 입력 스트림을 즉시 쓰거나 하위 프로세스의 출력 스트림을 읽지 못하면 하위 프로세스가 블록화되고 심지어 교착 상태가 발생할 수 있습니다.

당신은 당신이 자세한 출력을 얻을 수 있음을 언급, 그래서 try 블록의 끝으로 child.waitFor();를 이동하려고 할 것입니다. 당신이 아무것도 잃지 않을까 걱정할 필요가 없습니다. 오히려 스트리밍 데이터는 OS에서 매우 자연 스럽습니다. 나는 프로세스가 끝날 때까지 InputStream이 닫히지 않을 것이라고 확신한다.

+0

답장을 보내 주셔서 감사합니다. 그러나 여전히 도움이되지 않았습니다. 나는 아직도 그 루프의 내부를 치지 않고있다. 또한 출력 파일을 컴퓨터 어디에서나 찾을 수 없습니다. 시도 할 다른 것? – Ctcoggin

+0

그렇다면 정확히 어떤 줄을 고수하게 될까요? '프로세스 child = Runtime.getRuntime(). exec (command); 바로 뒤에? –

+0

서블릿은 오류를 발생시키지 않고 계속 실행됩니다. 지금은 출력을 보여주기 때문에 youtube2mp3 프로세스가 실행 중임을 알 수 없습니다. 따라서 결코 실제로 "붙어있는"것은 아닙니다. 왜 명령을 실행하지 않는지 말할 수 없습니다. 터미널에서 실행할 때 명령의 출력을 보여주기 위해 질문을 업데이트 할 것입니다. – Ctcoggin

0

마지막으로 작동하도록했습니다. "/ bin/sh"문자열 배열을 사용해야했습니다

try { 
     String outputInput = requestedSong.getTrackArtist() + "-" + requestedSong.getTrackTitle() + ".flv"; 
     String cmd1 = "sudo /usr/local/bin/youtube-dl --output=\"" + outputInput +"\" --format=18 \"" + requestedSong.getTrackUrl() +"\""; 
     String cmd2 = "sudo /usr/local/bin/ffmpeg -i \"" + outputInput +"\" -acodec libmp3lame -ac 2 -ab 128k -vn -y \"" + requestedSong.getTrackArtist() + " - " + requestedSong.getTrackTitle() +".mp3\""; 
     String cmd3 = "mv \"" + requestedSong.getTrackArtist() + " - " + requestedSong.getTrackTitle() +".mp3\" ~/Downloads"; 
     String cmd4 = "rm -f outputInput"; 

     String[] cmdList = {cmd1, cmd2, cmd3, cmd4}; 

     for(int i = 0; i < cmdList.length; i++) 
     { 
      String[] cmd = {"/bin/sh", "-c", cmdList[i]}; 
      System.out.println("CMD: " + cmdList[i]); 
      Process child = Runtime.getRuntime().exec(cmd); 
      InputStream in = child.getInputStream(); 
      Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(in))); 
      String line = ""; 
      while (sc.hasNextLine()) 
      { 
       line = sc.nextLine(); 
       System.out.println("INFO: " + line); 
      } 
      child.waitFor(); 
     } 
    } catch (InterruptedException ex) { 
     Logger.getLogger(ControlServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(ControlServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } 



    } 
+0

['exec' 정보에서 링크 된 Java World 기사를 방문하십시오. 페이지] (http://stackoverflow.com/tags/runtime.exec/info). 이 코드에는 여전히 문제가 있습니다. –

+0

글쎄 그것은 다운로드하고 내가 필요로하는 모든 일을합니다. – Ctcoggin

관련 문제