2

私のアプリはJava Play 2.0.4を使用しており、ビデオを返す Web サービス (同じホスト上の別のサーバーでホストされている) を呼び出すコントローラーを実装する必要があります。関係あるかわかりませんが、動画はm4v/mp4形式です。

これを行う正しい方法はどれですか? 使用AsyncResultは正しいと思いますが、それを回避する方法がわかりません。

現在、私は Web サービスを呼び出して、次の方法で Promise を取得しています。

Promise<Response> promise = WS.url(videoUrl).get();

その後、応答をバイトとして取得し、手動でヘッダーを設定してビューに返します。

Response response = promise.value().get();
byte[] video = response.ahcResponse().getResponseBodyAsBytes();
response().setContentType(format.equals("m4v") ? "video/x-m4v" : "application/x-shockwave-flash");
response().setHeader("Accept-Ranges", "bytes");
response().setHeader("Content-Range", "bytes 0-" + String.valueOf(video.length-1) + "/" + String.valueOf(video.length));
return ok(video);

これは時々機能しますが、動作は非常に不安定です。一部の (短い) ビデオは正常に読み込まれます。リクエストがキャンセルされるため、大きな動画は失敗します。また、Web サービスを呼び出すアクションへの要求が数回行われていることにも注目しました。常に動画の全長 (またはリクエストがキャンセルされる前に読み込めたもの) を返します。

また、そのアクションのルートにマップされるsrchtml5タグの属性からアクションを呼び出していることを追加することもできます。video

また、html5 のほとんどの動画は 206 Partial Content レスポンス ステータス (たとえば、http://video-js.zencoder.com/oceans-clip.mp4 ) で提供され、動画をストリーミングするために必要だと思います。

どんな助けでも大歓迎です。私はこれで数日間立ち往生しています。

前もって感謝します!

ゴンザロ

4

1 に答える 1

2

少し前に非常によく似たタスクがありました: How to send Windows Azure Storage blob with changed headers and I finished with ... java.net.URL, ファウンドなどではなく、タイムアウトの適切な処理に問題があったため.

今のところ問題なく動作していますが、巨大なファイルはなく、約 30 ~ 200 MB しかありません。

このアプローチがあなたを満足させるかどうかはわかりませんが、確認して、応答を送信することもできます...多分私も私の視点を修正します:)

public static Result movie(String path) {
    try {
        URL url = new URL(path);
        response().setHeader("Content-Disposition", "inline");
        response().setHeader(CONTENT_TRANSFER_ENCODING, "binary");
        return ok(url.openStream()).as("video/mp4");
    } catch (IOException ex) {
        warn("Path " + path + " is not working...");
        return badRequest("Movie server didn't answer");
    }
}

状況に合わせてスニペットを修正せずに申し訳ありません。コピーして貼り付けてください...問題なくアイデアが得られると思います

于 2013-03-15T22:18:38.813 に答える