オブジェクトだけのblobURLはないことを私は知っています。
ビデオバッファ用に独自のblobオブジェクトを作成し、それをblob://website.com/blablobblaのようなビデオタグのsrcで使用しました。私はそれが機能したブラウザでこのURLを開きました
youTubeビデオsrc(blob url)のURLを新しいタブで開いたとき、それは機能しませんでしたが、私のビデオsrc(blob url)は機能しました
Htmlビデオタグのsrcでのみ機能してエラーが発生するか、ブラウザの外部タブ/ウィンドウで機能しないように、blobURLで同じことを行う方法を知りたいです。知りたいだけです。このオブジェクトとblobオブジェクトの背後にあるテクノロジーとそれらのurlプロパティ。
質問は私にはやや曖昧に見えるので、これが私が解釈するものです(あなたの質問のフィドル画像のコードからも):
XMLHttpRequest()
Blob
-リクエスト(responseType = 'blob'
)を介してGET
(画像のバイナリデータ)を受け取りますURL.createObjectURL()
response
-オブジェクト(バイナリデータを保持するBlob
)のBlob URL
にXMLHttpRequest()
を含むURL Store
を作成します。Blob URL
- stringを画像のsrc
として設定します(そして、画像をドキュメントに追加して、ダウンロードしたばかりの画像を表示します)Blob URL
-文字列です)。あなたのコメントであなたは言う:
フィドルでは画像を調べてsrcをコピーし、新しいタブに貼り付けました動作し、画像を表示しました画像をblobのURLで直接表示したくない。
あなたがユーチューブに行き、新しいタブでビデオのソースを開くと:それは機能しません、、 これを起こさせたい
notユーザーがBlob URL
-文字列をコピーして(ライブソースまたは単にright-click-on-image>>Copy Imagelocation
を調べて)新しいblobに貼り付けるときに、blobを表示/ダウンロードできるようにしたいようです。タブ/ウィンドウ(例としてyoutubeを挙げます)。
しかし、あなたはまたビデオについて話している。
TL; DR:あなたの質問/報奨金はwindow.URL.createObjectURL();
によって返される2つの異なるタイプのURLを混同しているようです:
Blob URL
参照(表すオブジェクト) '生のローカルデータ'((Local-)File、Blobなど)Blob URL
から自動的に(またはプログラムで)取り消しURL Store
を実行します(ブラウザ内の簡略化されたローカルウェブサーバーと見なすことができ、ブラウザ)。var myBlobURL=window.URL.createObjectURL(object, flag_oneTimeOnly);
Blob URL
を返します:window.URL.revokeObjectURL(myBlobURL)
(Blob URL
文字列をRevocation List
に追加します)。flag_oneTimeOnly
があり、最初の使用後にBlob URL
を自動的に取り消すために使用されていましたが、現在は仕様の一部ではありません。また、このフラグはとにかく機能しないことがよくありました(少なくともFirefoxでは)。var myBlobURL=window.URL.createFor(object);
Blob URL
を返します。MediaSource object URL
参照特別MediaSourceオブジェクトsrc
(<audo>
&<video>
要素を考えてください)のHTMLMediaElement
を特別なMediaSource Object
にリンクすることのみを目的としていますHTMLMediaElement
ではありませんwindow.URL.createObjectURL();
を介して作成されますが質問の画像のフィドルで何が起こっているかそしてビデオをBlob
としてダウンロードした同様のコード(xhrを使用してサーバーにビデオファイルのデータ/バイナリ全体をダウンロードした場合) =またはその他の「ローカル」データ:
基本的に 'bare''un-enhanced' File-API を使用しています。URL Store
はセッション中にのみ維持され(したがって、同じセッションであるため、ページの更新後も存続します)、ドキュメントがアンロードされると失われます。
したがって、フィドルがまだ開いている場合、フィドルドキュメント(Blob URL
を作成したドキュメント)は明らかにnotまだアンロードされていないため、ブラウザでBlob URL
sを使用できます(任意タブ/ウィンドウ)取り消されない限り!
これは関連性があります機能:ブラウザでBlob
をビルド/ダウンロード/変更し、Blob URL
を作成して、ファイルダウンロードリンクへのhref
として設定できます(ユーザーはこれを実行できます)右クリックして新しいタブ/ウィンドウで開きます!!)
フィドルを閉じるか、Blob URL
からURL Store
を取り消すと、Blob URL
にアクセスできなくなります(別のタブ/ウィンドウにもありません)。
変更したフィドルを試してみてください:https://jsfiddle.net/7cyoozwv/
このフィドルでは、画像のURLをコピーした後(画像がページに表示された後)、サンプル画像を別のタブ/ウィンドウに読み込むことができなくなりました。
ここでは、URLを手動で取り消しました(revokeObjectURL()
)。これは、現在最良のクロスブラウザー方式であるためです(一部、APIがまだ完全に安定していないため)。
また注意:要素のonload
イベントは、Blob URL
を取り消すためのエレガントな場所になります。
これは、window.URL.createObjectURL(MediaSource)
:によって返される<audio>
を使用して<video>
にリンクされたMediaSource Object
またはMediaSource object URL
ソースに何が起こっているかです。
Media Source Extensions(MSE)また拡張File-API
のwindow.URL.createObjectURL()
はMediaSource Object
を受け入れます。 (の現在のドラフト) RL Object Extension は、次のことを指定します。
このアルゴリズムは、autoRevokeをtrueに設定したcreateObjectURL()[FILE-API]メソッドの動作を反映することを目的としています。
File API
のwindow.URL.createObjectURL()
もはやの現在の仕様には、代わりにwindow.URL.createFor()
を使用する必要があるプログラマーがアクセスできるautoRevoke
(またはflag_oneTimeOnly
)ブールフラグがあることに注意してください。 Media-Source仕様がいつそれを模倣するのだろうか(そして下位互換性のためにそれらのcreateObjectURL()
を新しいcreateFor()
拡張にエイリアスする(それが現在の動作を意図しているように見えるのでより適切であるように思われる))。
これらの結果の自動的に取り消されたURL文字列は意図されただけsrc
のHTMLMediaElement
(<audo>
&<video>
要素を考えてください)を特別なMediaSource Object
にリンクします。
空のDocument
(新しいタブ/ウィンドウから)が<audo>
または<video>
要素であるとは思いません。
おそらく「MSEのクイックチュートリアル」(ソース: [〜#〜] msdn [〜#〜] ) 違いと基本的な使用法を明確にするのに役立つかもしれません:
MSE APIを使用するには、次の手順に従います。
- ページのHTMLセクションでHTML5
video
要素を定義します。- JavaScriptで
MediaSource
オブジェクトを作成します。createObjectURL
オブジェクトをソースとしてMediaSource
を使用して仮想URLを作成します。- ビデオ要素の
src
プロパティに仮想URLを割り当てます。- 追加する動画のmimeタイプを使用して、
SourceBuffer
を使用してaddSourceBuffer
を作成します。- オンラインのメディアファイルからビデオ初期化セグメントを取得し、
SourceBuffer
を使用してappendBuffer
に追加します。- メディアファイルからビデオデータのセグメントを取得し、それらを
SourceBuffer
とともにappendBuffer
に追加します。- ビデオ要素で
play
メソッドを呼び出します。- 完了するまで手順7を繰り返します。
- 掃除。
あなた(またはクライアントのプラットフォームで再生するためにサポートされているテクノロジーを動的に選択するYouTubeのような大物プレーヤー(したがって、あなたが話しているYouTubeビデオのURLの種類を確実に知る方法はありません))could新しい特別なMediaSource Object
を使用してビデオ(またはオーディオ)を再生しています。
これにより、ストリーミングサポートのためにHTML5ビデオにバッファーベースのソースオプションが追加されます(再生する前に完全なビデオファイルをダウンロードするか、SilverlightやAdobe Flashなどのアドオンを使用してメディアをストリーミングする場合と比較して)。
これがあなたが求めていたものであることを願っています!
実際、参照しているURLは、BLOB
自体(関数"string"
を使用して作成されます)へのwindow.URL.createObjectURL
参照にすぎません。そのため、通常のURLのように使用できます。また、スコープはドキュメントがアンロードされるまでのみです。
ですから、ブラウザだけでURLを開くことはできないと思います。また、私はあなたが言っていることを再作成しようとしましたが、役に立ちませんでした(私自身のウェブサイトで、blobを作成し、URLをブラウザーに入れます)。
以下はコードです
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://kurrik.github.io/hackathons/static/img/sample-128.png");
xhr.responseType = "blob";
xhr.onload = function response(e) {
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL(this.response);
console.log(imageUrl);
var imgDOM = document.createElement("img");
imgDOM.src = imageUrl;
document.getElementById("divImage").appendChild(imgDOM);
};
xhr.send();
フィドル ここ
更新:
わかりました、私がそれを見た後。 YouTubeがビデオのストリーミングに media-source を使用しているようです。
フィドルを更新していません(使用できるビデオが見つかりません)。ただし、基本的には、同じ関数(createObjectURL
)を使用してblobURLを作成します。ただし、ソース(画像、ビデオなど)を使用して関数に渡す代わりに。 MediaSource
オブジェクトを関数に渡す必要があります。
次に、blob URLを使用して、それをvideo.src
に渡します。したがって、blobリンクを開こうとすると。あなたは再びビデオを見ることができないはずです。