13

サーブレットを使用してオーディオ/ビデオファイルをWebにストリーミングしたいと思います。

次のサーブレットで試行しました。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    File file = new File("/Users/myfolder/Documents/workspace/love.mp3");
    response.setContentType(getServletContext().getMimeType(file.getName()));
    response.setContentLength((int) file.length());
    Files.copy(file.toPath(), response.getOutputStream());
}

そして次のHTML:

<a href="/media" data-format="mp3 ogg">Click Here!</a>

ただし、プレーヤーはロード中です...ロード中...ロード中...

これはどのように発生し、どうすれば解決できますか?

4

1 に答える 1

24

多くのメディアプレーヤーは、サーバーがいわゆるHTTP範囲要求をサポートすることを要求します。Rangeつまり、要求に応じて、ヘッダーを使用してメディアファイルの特定の部分を返すことができる必要があります。たとえば、10MBの長さのファイルでは、2000までのインデックスが正確に1000のバイトのみです。これは、メディアストリームの特定の範囲を十分に速くスキップできるようにするため、および/またはファイルの異なる部分をそれぞれ要求する複数の接続を作成することによってバッファリング速度を向上させるために、多くのメディアプレーヤーにとって必須です。

ただし、これはサーブレット内の多くの追加コードであり、HTTPRange仕様を十分に理解している必要があります。通常、servletcontainer(Tomcat、JBoss AS、Glassfishな​​ど)独自のデフォルトサーブレットは、これをすぐにサポートします。したがって、標準的な方法でメディアフォルダをWebに公開する方法があり、そのためにサーブレットを自家栽培する必要がない場合は、このルートを使用します。

使用しているservletcontainerが不明なため、この例ではTomcatを想定しています。

  1. love.mp3Webプロジェクトの公開Webコンテンツにファイルをドロップするだけ<a href="love.mp3">で、サーブレット全体を必要とせずにファイルを利用できるようになります。

  2. または、love.mp3ファイルをフォルダの新しいサブフォルダに配置します。Tomcat/webapps例:Tomcat/webapps/media/love.mp3。このようにして、によって利用可能になります<a href="/media/love.mp3">

  3. または、love.mp3ファイルをディスク上の別の場所に配置します。たとえば、 Tomcatに次の行を追加して、新しいコンテキストとしてフォルダを/path/to/media/love.mp3追加します。/media/conf/server.xml

     <Context docBase="/path/to/media" path="/media" />
    

    このように、それはによって<a href="/media/love.mp3">も利用可能です。

DefaultServletいずれにせよ、リクエストを適切にサポートするTomcat独自のRangeがコンテンツのストリーミングに使用されます。

ただし、servletcontainer独自のデフォルトサーブレットを利用する方法がまったくない場合は、Rangeリクエストを適切にサポートするようにサーブレットコードを書き直す必要があります。TomcatDefaultServletOmniFacesFileServletなどのオープンソースの例からインスピレーションを得ることができます。

参照:

于 2012-11-27T16:16:50.893 に答える