2011-08-11 11 views
1

私は非常に迅速にpngを生成するサーバーを持っており、これを貧しい人のビデオフィードにする必要があります。実際にビデオフィードを作成することは選択肢ではありません。Canvas vs Fauxビデオプレーヤーの画像

私が今取り組んでいることは(擬似コードで)少し、このようになります再帰ループです:

function update() { 
    image.src = imagepath + '?' + timestamp; // ensures the image will update 
    image.onload = function() {update()}; 
} 

これは動作しますが、しかし、しばらくして、それがブラウザ(Google Chromeを、クラッシュ10分以上経過した後)。これらの画像は非常に頻繁に更新されています(1秒に数回)。画像がキャッシュされているようで、ブラウザのメモリが不足しています。

高速リフレッシュを維持しながら、問題を解決するこれらのソリューションの

  • HTML5のキャンバスのdrawImage
  • HTML5のキャンバスCanvasPixelArray(生のピクセル操作)

と私はアクセス権を持っています生のバイナリにUint8Arrayとして渡します。画像はあまり大きくない(50kb以下、720 x 480ピクセル)。

はまた、キャッシュから古い画像を消去するか、完全にキャッシュを避けるために、とにかくはありますか?

EDIT:

注、これは通常のユーザーのためのツールではありません。エンジニアのためのアナログハードウェアの問題を診断するツールです。ブラウザの理由はプラットフォームの独立性です(Linux、Windows、Mac、iPadなどのソフトウェアを変更しなくても動作します)。

+0

私は本当に誰も彼のブラウザで毎秒いくつかのPNG画像が必要なのか分かりません。いくつかの種類のアップデートGIFを使用することを検討する必要があります... –

+0

工業グレードのデータを考えてください。通常のユーザーにとってはそれほど美しいものではなく、エンジニアがハードウェアの問題を診断するためのツールです。私はそれを反映するために私の質問を編集します。 – tjameson

答えて

1

クラッシュがhttp://code.google.com/p/chromium/issues/detail?id=36142であるためです。次のフレームがロードされた後、オブジェクトURLを作成して(XHR2 responseType = "arraybuffer"BlobBuilderを使用して)、前のフレームを取り消す(URL.revokeObjectURLを使用して)ようにしてください。

編集:あなたは実際にこれらをサーバー側のライブの低周波ビデオストリームに処理する必要があります。これにより、待ち時間が大幅に短縮され、読み込み時間が大幅に短縮されます。

+0

これはキャッシングを避けることができますか?私は、ブラウザがすべてをキャッシュしていたためにimage.srcのバグがあったという印象を受けました。私はそれを読んでいないので、私は確信することはできません。 – tjameson

+0

私は確かにはわかりませんが、すでにローカルになっているので、オブジェクトURLをキャッシュすることはほとんどありません。 –

0

"ムービー"がデータ駆動型(つまり、数値と計算に基づいている)の場合、多くのデータをブラウザにテキストとしてプッシュし、JavaScriptをクライアント側でムービーにレンダリングすることができます。クライアントの「プレーヤー」は、必要に応じてバッチでデータを要求できます。

ない場合は、あなたができる一つのことは、単にスクリプトのフレーム毎秒(FPS)、おそらくハードコードされた値、またはスライダー/設定可能な値を制限しています。これがツールの有用性を制限しないと仮定すれば、少なくともブラウザがより長いw/oのクラッシュを実行できるようになります。

は最後に、ヘッダで行うことができるものがたくさんあります(例。の.htaccessファイルで)キャッシュやコンテンツをキャッシュしないようにブラウザに指示します。

+0

これは技術的にデータ駆動型ですが、それはかなり複雑で、計算に必要なすべてのデータを送信することは、イメージ自体よりも大きくなります。 pngは、アナログデバイスからの生の出力から生成されます。その上には薄いデータレイヤーがありますが、最終的にはクライアント上に生成するのがはるかに高価になります。 – tjameson

1

@Eli Greyがクラッシュの原因を特定したようです。彼らは作品に修正があるように見えるので、もしあなたがあなたのアプローチをうまく修正したくなければ、それはすぐに解決されるでしょう。

可能であれば、あなたの他の質問に関しては、間違いなくdrawImage()に固執する必要があります。CanvasPixelArrayを使用する意図がわかっている場合、キャンバス内の各ピクセルを繰り返し、新しいピクセル情報で更新することを検討していますか?もしそうなら、これはどこにもありませんと同様に効率がdrawImage()になります。さらに、前のフレームのデータを参照する必要がない(おそらく)ため、このアプローチはまったく必要ありません。

幸いにも、HTML5キャンバスに保存されたCanvasPixelArray内部オブジェクトを直接スワップアウトすることはできません。正しくフォーマットされたピクセルデータの配列を持っている場合、キャンバス要素を更新できる唯一の方法は、drawImage()またはputImageData()のいずれかを呼び出すことです。今のところ、putImageData()drawImage()よりもはるかに遅いです。ご覧のとおり、http://jsperf.com/canvas-drawimage-vs-putimagedataです。あなたのビデオのフレームに透明性がある場合は、キャンバスをクリアしてからdrawImage()を使用することをお勧めします(そうしないと、前のフレームまで見ることができます)。

これまでに言いましたが、実際にはキャンバスを使用する必要があることはわかりません。あなたがキャッシングを避けることができるようにキャンバスを使用することを目指していたのはあなたのモチベーションでした(今はあなたの根本的な問題ではないようです)。

+0

はい、それは私のクラッシュの原因だと思ったので、キャッシングを避けることでした。約10分かかりますが、最終的にブラウザ全体がクラッシュしてしまいます(私はカーネルレベルの何かが怒って蹴ったと思っています)。 – tjameson

+0

。次に、ピクセルデータで作業する必要がない限り、キャンバスベースの実装を避けることをおすすめします。このような機能が必要ない場合は、キャンバス要素をミックスに追加することで、既に気づいているように、時間のかかるアプリケーションのオーバーヘッドが不必要に増加します。 – Xenethyl

+0

うん。できるだけリアルタイムで実行する必要があります。私はアップデートが1秒間に約10回だと思いますが、画像は大きくはありません(30k程度のものなど)ので、問題を明らかにするにはしばらく時間がかかります。 – tjameson

0

iPad?あなたは言うでしょうが、私はフラッシュ/ビデオやHTML5 /ビデオを使ってアドバイスをします。

WebKitのは非常に簡単に画像の中程度の流入に墜落しているので、ちょうど大きな画像や小さなもののほんの膨大な数のいずれか..他の側から

、base64で画像データや画素配列とのXHRはうまくいくかもしれません。私は10秒ごとにXHRポーリングサーバーで10-12時間実行することができた短いポーリングアプリを持っていました。

また、横軸のヒストグラムが時間スケールである場合、デルタ圧縮を考えてみましょう。ヒートマップのようなものについては、少ししかスライスを送ることができません。もちろん、それはできません。

これらの画像は非常に頻繁に更新されています( 秒数回)。

..そのような高いレートで更新することが非常に重要な場合 - long pollingを使用する必要があります。

+0

私は長いポーリングを使用しますが、画像がロードされるたびに(毎秒10回以上)ポーリングを行います。 – tjameson

+0

それから_short polling_?長いポーリングでは、要求の間隔は約60秒になるはずです。私は長いポーリングに使用するための定義を参照してください – c69

+0

[ウィキペディア](http://en.wikipedia.org/wiki/Push_technology#Long_polling)。ロング・ポーリングとは、データが準備できるまでサーバーが応答するのを待ってから、クライアントが直ちに別の要求を送信することを意味します。 – tjameson

関連する問題