1

私の HTML5 テスト ファイルでは、次の場合に mp3 サウンド ファイルを正常に再生および再再生できます。

  1. ファイルがローカルでホストされている、または
  2. それらは従来の Web ホストでホストされています ( http://sgdk2.enigmadream.com/ben/iotaBuildIt/sound.htmlを参照) または
  3. Internet Explorer から再生します

次の場合、最初はサウンドを再生できますが、2 回目は再生できません。

  1. ファイルは Mercurial リポジトリでホストされており、かつ
  2. Chrome を使用してファイルにアクセスしています

(IE を使用して Mercurial でホストされているファイルにアクセスする場合、問題はありません。)

これらの条件下では、次のいずれかの場合にファイルを再再生できません。

  1. HTML ページ ( http://hg.code.sf.net/u/bluemonkmn/myiota/raw-file/97ac02a717fe/HTML/sound.html )経由でアクセスする スクリプトにそれを再生させることはできません。オーディオ コントロール UI を使用して再生できません。または
  2. ファイルに直接アクセスする ( http://hg.code.sf.net/u/bluemonkmn/myiota/raw-file/97ac02a717fe/HTML/bing.mp3 )

Chrome が IE のように Mercurial でホストされているオーディオ ファイルを再生できるように、誰かが説明したり、修正を手伝ってくれたりできますか? また、私は FireFox をテストしていません。

4

2 に答える 2

2

推測する必要がある場合、違いは Apache 静的ファイル サービスと hgweb が提供するヘッダーにあると言えます。Apache の静的ファイル サービスからの .mp3 ファイルの出力は次のとおりです。

$ HEAD -Ssed http://sgdk2.enigmadream.com/ben/iotaBuildIt/bing.mp3
HEAD http://sgdk2.enigmadream.com/ben/iotaBuildIt/bing.mp3
200 OK
Connection: close
Date: Wed, 23 May 2012 16:55:03 GMT
Accept-Ranges: bytes
ETag: "4d0cbbe-16c7-4bd83a906c040"
Server: Apache
Content-Length: 5831
Content-Type: audio/mpeg
Last-Modified: Thu, 12 Apr 2012 23:24:41 GMT

ここでは、hgweb の raw-files ハンドラーからのものです。

HEAD http://hg.code.sf.net/u/bluemonkmn/myiota/raw-file/97ac02a717fe/HTML/bing.mp3
200 Script output follows
Connection: close
Date: Wed, 23 May 2012 16:56:33 GMT
Server: Apache/2.2.3 (CentOS)
Content-Length: 5831
Content-Type: audio/mpeg
Content-Disposition: inline; filename="bing.mp3"

大きな違いは、Apache がAccept-Rangesヘッダーを含み、hgweb がContent-Dispositionヘッダーを提供することです。

ここのContent-Dispositionヘッダーは、saveAs のデフォルトのファイル名をブラウザに提示するだけなので、おそらく原因ではありません (ただし、原因はわかりません)。

ヘッダーはAccept-Rangesもっと面白いです。本来の目的ではありませんが、ストリーミング オーディオとビデオの再生を求めるバックボーンになっています。再生をシークの特殊なケース (ゼロへのシーク)と考える場合、Chrome はそれを無効にしている可能性があります。これは、Accept-Rangesヘッダーがないとまったくシークできないと考えているためです (もちろん、ゼロへのシークは単に再生しているだけです)。またゼロから)。

それは間違いなくただの唾吐きですが、テストするのは簡単です. 次のようにmod_headersを使用するように hgweb の apache ホストを微調整します。

header add Accept-Ranges bytes

あなたを実行しているパスhgweb(wsgiでもcgiでも)。Content-Dispositionヘッダーを削除することもできmod_headersます。

最終的には、ネットワーク上のバイトがすべてです。hgweb と Apache がまったく同じバイトを返すようにすると、Chromeそれを同じように処理します。

注:もちろん、Accept-Ranges: byteshgweb の出力にヘッダーを追加しても、実際には hgweb にバイト範囲サポートが追加されない場合がありますが、それは問題ありません。hgweb はRange: bytes=xxxxヘッダーを無視するだけで、206 Partial Responseステータスを返す代わりに a を返し200 OKます。RFC によると、クライアント (Chrome) で処理する必要があります。そのため、ファイルをスキップすることはできませんが、Chrome でシークして開始/再生できるようにするだけで十分な場合があります。

于 2012-05-23T17:10:48.803 に答える
1

Chromiumのバグ#129165を報告しましたが、これはLinuxで動作するように見えるため、バグであると疑われています。

于 2012-05-22T13:53:25.367 に答える