問題タブ [media-source]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
html - MediaSource API - 複数の動画を 1 つのバッファに追加/連結する
アップデート:
SOオフセットタイムスタンププロパティを使用してこれを機能させることができました(各ビデオを追加した後にインクリメントします)。
私の質問: 1) MediaSource.mode をシーケンスに設定するときに、これが正しく行われないのはなぜですか?
2) MediaSource.duration が常に「Infinity」であり、正しい期間ではないのはなぜですか?
MediaSource API を使用して、複数のビデオ ファイルを追加し、1 つのビデオのようにシームレスに再生しようとしています。
仕様 (DASH-MPEG) に従ってビデオを適切にトランスコードしましたが、個別に再生すると正常に動作します。
ただし、複数を追加しようとすると、セグメントが互いに上書きされたり、期間が正しくないなどの問題が発生します。すべてが期待どおりに実行されているように見えますが。
私はoffsetTimestampをいじってみましたが、ドキュメントによると、MediaSource.modeを「sequence」に設定すると、これが自動的に処理されます。また、何らかの理由で、セグメントを追加した後でも MediaSource.duration は常に「無限」のようです。
これが私のコードです:
そして、ここにログがあります:
media - Fragmented mp4(fMP4)とは正確には何ですか? 通常のmp4とどう違うの?
Media Source Extension ( MSE ) は、ブラウザで再生するためにフラグメント化された mp4 を必要とします。
javascript - ビデオ データのどのバイトが現在の再生位置を参照するか
ブラウザでビデオを再生するために、メディア ソース拡張機能を使用しています。
私の JavaScript プログラムは、ビデオ ファイルを 1200 バイトのフラグメントに分割します。ビデオは次のコーデックでエンコードされます: video/mp4; codecs="avc1.42E01E, mp4a.40.2".
秒単位で時間 X を指定すると、位置 X でビデオを再生するために必要な対応する最初のフラグメント (または、この位置の近くではあるが後ではないフラグメント) を見つけたいと考えています。より具体的には、HTMLMediaElement の currentTime プロパティの時間に属するフラグメントを見つけたいと考えています。動画ファイルは事前に解析できます。
javascript - Chrome で MediaStream オブジェクトを作成しますか?
私の知る限り、MediaStream オブジェクトは getUserMedia から返されますが、ローカルの .mp4 または .webm ファイルから MediaStream オブジェクトを作成する方法はありますか? (または他のハックっぽい方法)
これを必要とする特定のテストを自動化するために、これを調べています。
編集:これはChrome固有です。現在、Firefox にはキャンバス操作があり、必要なことは実行されますが、Chrome にはありません (まだ?)
編集 2: これは Firefox に使用されるものです https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/captureStream
Chromeに相当するものはありますか? それとも、別の方法で MediaSteam オブジェクトを再作成する方法が本当にないのでしょうか。. .
今考えられる唯一のことは、これを Firefox で webrtc ピア接続に使用して、それを chrome ピア接続に送信し、受信したストリームが有効であることを期待することです。
html - MediaSource.isTypeSupported の MIME タイプを取得する
ffprobe/ffmpeg で渡す必要が ある Mime タイプを取得するにはどうすればよいですか?MediaSource.isTypeSupported
たとえば、私のコンピューターでは、次のように返されますtrue
。
そうではありませんが
avc1.64000d,mp4a.40.2
特定のビデオの部分に対応するものを取得する方法がわかりません。これは、この部分がどのように見えるかのより大きなリストです。
ffprobe -show_streams -i video.mp4
を含む多くの興味深い情報を返します。
と
'video/mp4; codecs="avc1.0x31637661,mp4a.0x6134706d"'
これが戻ってきfalse
て、それが例外的な引数ではないためなのか、ビデオが実際にサポートされていないためなのかわかりません。
html - メディア ソース - キー フレームで始まらないバッファを持つことは可能ですか?
メディア ソース エクステンションを使用して、バッファがキー フレームではなく通常のフレームで始まるようにバッファリングを行うことは可能ですか?
たとえば、フレームごとにビデオをバッファリングすることは可能ですか? (それが非常に賢明だとは言っていません!)
video-streaming - アダプティブ ストリーミング - 多くのキー フレームを避ける
環境:
Media Source Extension プロトコルに基づくアダプティブ ストリーミングを使用して、html5 ビデオ プレーヤーを構築しています。私はmp4を使用しています。
問題:
同じビデオの 2 つのバージョン (高品質と低品質としましょう) があり、ほとんど遅延なくバージョンを切り替えられるようにしたいと考えています。問題は、バージョンを変更するときに、キー フレームで始まるフラグメントが必要であり、ビデオにキー フレームが頻繁にあると、帯域幅に非常に悪いことです。
ユーザーがバージョンを変更したときにキー フレームで始まるフラグメントと、それ以外のキー フレームのないフラグメントを送信する方法を探しています (キー フレームのないフラグメントを持つことに関する Chromiumのバグを認識しています。しかし、今のところそれを無視しましょう。修正されようとしています)
私は、多くのキー フレームを含むビデオの各ストリームを複製し、(明らかに最初のフレームを除いて) キー フレームを含まない別のストリームを複製し、ビデオ バージョンを切り替えるときにキー フレームを含むストリームのみを使用することを考えました。次のようになります。
したがって、各フレームはキー フレーム、または先行フレームを正常にデコードできる通常のフレームのいずれかです。これにより、ネットワーク経由で送信されるキー フレームの数が最小限に制限されます。
しかしねえ!A1
からへの切り替えA2
は、ブラウザによってビデオ ストリームの変更として認識されA2
、キー フレームで開始されないため機能しません。
そのような結果がどのように達成されるかについて、賢い考えを持っている人はいますか? 私は現在、クライアントの moov と moof アトムを書き直して、プレーヤーを騙して、すべてが例外であると思わせることを考えています。しかし、私はそれについてあまり知りません...
動機:
私は360プレーヤーに取り組んでいます。360 度は、ストリーミングされているが表示されていないビデオの大部分があるため、困難です。つまり、帯域幅が制限されているため、表示されるビデオの部分は、人々が慣れているものよりもはるかに低品質です。それぞれが異なるビュー方向を中心とする複数のバージョンのビデオを生成するためのツールとテクニックがあり、プレーヤーは実行時にどのバージョンをストリーミングするかを決定します。
ユーザーはいつでもビューの方向を変更できるため、バイト レートの適応よりも、そのような変更に迅速に対応できることが非常に重要です。そして、このことの目的は帯域幅を節約することなので、たくさんのキーフレームを追加することから始めるのは良くありません!
また、iOS Safari は 360 プレーヤーの鍵となるインライン ビデオをサポートしていないため、iOS Safari でサポートされていない MSE に頼っても問題ありません (真剣に、彼らは何をしているのですか?)。