2016-08-24 9 views
0

私は、断片化されたmp4とウェブソケットの組み合わせを使用して、MSEが引き継ぐウェブブラウザにライブビデオストリームをストリーミングします。ウェブサイトを使用して途中でライブビデオストリームにアクセスする

ffmpegを使用して適切なfmp4形式に断片化し、mpeg4parserツールを使用してデータをチェックしました。 websocketサーバを利用すると、着信データはwebsocket経由で接続されているすべてのブラウザクライアントにブロードキャストされます。これは、再生とライブストリーミング(rtspストリームを入力として使用)の両方でうまく動作します。

私が直面している問題は、クライアントが途中でストリームにアクセスしようとしたとき、つまりffmpegストリームが開始されたときに発生します。私はinitセグメント(ftyp + moov)要素をwebsocketサーバーのキューバッファに保存しました。このキューバッファは、このデータを接続時に新しいクライアントに送信します。

ブラウザコンソールが「メディアソースエレメントが見つかりません」というエラーをスローしないため、このデータが正しく送信されていると思います。それでも、ブロードキャストされたmoof/mdatペアを受信すると、ビデオはストリーミングされません。

だから、私は答えをしたいと思い質問のカップルは、次のとおりです。

1)私は、各moof要素は、それがmfhdの子要素内のシーケンス番号が含まれていることを観測しています。これは常に1から開始する必要がありますが、中途半端にアクセスするビデオストリームの場合は当然ありませんか?

2)ブラウザのclient.jsでデータを表示できますか?現在私が見ることのできるのは、mediaBufferに[Object ArrayBuffer]の束が含まれていることです。これらのバッファにバイナリデータを印刷できますか?

3)サーバー側から、ffmpeg出力からwebsocketサーバーに到着する新しいデータがmoof要素で始まるたびに、データはmoof/mdatフラグメントで送信されるようです。これは、バイナリデータをコンソールに出力することによって認識されました。クライアント側でこのデータを表示するのと同様の方法がありますか?

4)誰がなぜこれが起こっているのか考えていますか?断片化されたmp4やISO BMFFのフォーマットの詳細は、私が紛失しているものがあります。

明確化のために詳細が必要な場合は、私にお知らせください、私はそれを提供します。

答えて

0

フラグメントにベースメディアデコード時間が含まれていることを確認してください。次に、ビデオタグ 'currentTime'を受信した最初のフラグメントの時刻に設定します。

+0

私は自分のフラグメントをチェックしました。彼らはすでにベースデコード時間を含んでいると思います。 12800 TBN、25 TBC 私はこれを見ることができます:moof要素内 は、ffmpegの中でデフォルトで使用されるタイムベースがあり、連続断片 ため0,512,1024,3072などの値を持つtfdtのセクションがありますmpegパーサーツールの助けを借りて、私はjavascriptでvideo.currentTimeを設定する方法を理解しています。私が理解できないことは、jsでこのデコード時間値にどのようにアクセスすればよいのでしょうか?私はmpegparserツールの助けを借りてそれを見ました。このデコード時間は、クライアント側の特定の関数または要素IDを使用してアクセスされますか? – Nishanth

+0

バッファ領域を照会できます。次に、video.currentTimeを最初の領域の開始点に設定します。すべてのAPIドキュメントはw3cで入手できます。 – szatmary

+0

ありがとうszatmaryたくさん。リフレッシュ条件と新しいユーザーが参加したときにビデオが正常に再生されています。 簡潔な解答: videoElementによって再生されるビデオソースバッファにバッファリングされたデータがあります。 バッファには、TimeRangeオブジェクトを返すAPI video.bufferedを使用してアクセスします。このオブジェクトには、開始時間と終了時間を含むいくつかのパラメータが含まれています。 開始時刻の間にビデオストリームにアクセスするユーザーは、ゼロ以外の正の値になります。 video.currentTimeを正の値に設定して、有効なバッファ範囲から再生するようにビデオ要素に指示します。 – Nishanth

関連する問題