1

Raspberry Pi の Java プロジェクトに取り組んでおり、ランタイムを正しく動作させるために助けが必要です。

youtube2mp3 は youtube-dl と ffmpeg を使用します (情報: http://jeffreyv.hubpages.com/hub/Youtube-to-MP3-on-Ubuntu-Linux )

iMac でコードを書いているときに、スクリプトを少し変更しました。

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

それから、サーブレットでそれを呼び出してダウンロードを開始するのにうんざりしました。

try {
        String command = "sudo /usr/local/bin/youtube2mp3 \"" + requestedSong.getTrackUrl() +"\" \"" + requestedSong.getTrackArtist() + "-" + requestedSong.getTrackTitle() + ".mp3\"";
        System.out.println("CMD: " + command);
        //Process child = Runtime.getRuntime().exec( new String[]{"/usr/local/bin/youtube2mp3", "\"" + requestedSong.getTrackUrl() + "\"", "\"" + requestedSong.getTrackArtist() + "-" + requestedSong.getTrackTitle() + ".mp3 \""});
        Process child = Runtime.getRuntime().exec(command);
        child.waitFor();
        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);
        }
    } 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);
    }


}

コマンドは実行時に非常に冗長ですが、スキャナーオブジェクトは何も取得しません。このコードをサーブレットに残し、スレッドも使用しようとしましたが、どちらも失敗しました。

コマンドの実行に sudo は必要ありません。管理者のパスワードを要求しないように、既に sudoers ファイルに変更しています (Runtime() を使用して、プログラムの前半で arp スキャンを実行しています)。

「コマンド」が出力するターミナルにルールをコピーして貼り付けることができ、正常に動作します。

どんな助けでも大歓迎です。

アップデート

youtube2mp3 コマンドを実行した結果の出力は次のとおりです。

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
4

2 に答える 2

1

Process クラスのドキュメントから:一部のネイティブ プラットフォームでは、標準の入力ストリームと出力ストリームに制限されたバッファー サイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りが迅速に行われないと、サブプロセスがブロックされ、デッドロックさえ発生する可能性があります。

詳細な出力が得られるとのことでしたので、ブロックchild.waitFor();の最後に移動してみます。try何かを失うことを心配する必要はありません。それどころか、ストリーミング データは OS では非常に自然です。いずれにせよ、プロセスが終了するまで InputStream は閉じられないと確信しています。

于 2012-09-07T16:10:00.947 に答える
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);
    }



    }
于 2012-09-07T22:51:40.293 に答える