web-dev-qa-db-ja.com

mp4boxを使用したライブストリーミングダッシュコンテンツ

メディアソース拡張APIを使用してH.264コンテンツをHTML5にライブストリーミングしようとしています。

次の方法は非常にうまく機能します。

ffmpeg -i rtsp://10.50.1.29/media/video1 -vcodec copy -f mp4 -reset_timestamps 1 -movflags frag_keyframe+empty_moov -loglevel quiet out.mp4

そして:mp4box -dash 1000 -frag 1000 -frag-rap out.mp4

MP4Box出力(out_dashinit.mp4)を取得し、それをWeb Socketsを介して、チャンクごとに、メディアソースAPIにフィードするJavaScriptクライアントに送信できます。

ただし、これはライブコンテンツには適していません。

私が今やろうとしているのは、リアルタイムで可能な限り最小のレイテンシーでそれを行うために、単一のパイプラインを作成することです。 FFmpegを使用すると、出力をout.mp4ではなくstdoutにリダイレクトして、コンテンツを取得することができます。 MP4Boxをパイプラインに組み合わせることが可能かどうかわかりませんでした。

  1. MP4Boxは、ファイルではないソースから入力データを取得できますか?
  2. MP4Boxは、リアルタイムで到着している間に、そのようなコンテンツを(ファイルまたは他のソースから)段階的に取得できますか?つまり、ストリームが1秒間停止し、自動的に再開する場合は、少し待ちます。
  3. 同じ質問ですが、出力についてです。ファイルではないもの(stdoutなど)に出力できますか。また、出力データの準備ができたらいつでもそれを取得して転送できるように、段階的に出力できますか。それをWebクライアントに送信し、本質的に終わりのない破線のMP4を生成します。
13
galbarm

必要な出力を生成するためにMP4Boxは必要ありませんが、生成されたファイルでボックスを探してコンテンツを自分でチャンク化する必要があります。

基本的には、fMP4H264を生成し、初期化用のmoovボックスと、生成するMP4の各フラグメントのmoof+mdatボックスをブラウザに送信します。プレーヤーをJavaScriptでコーディングする必要があります。おそらく、標準のDASHプレーヤーを使用することはできません。

正しいフラグメント化されたMP4を生成するには、これをffmpegに渡す必要があります:-movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof

入手可能な最新バージョンを使用してください。

11
Pablo Montilla

私があなたの解決策を理解している限り、あなたはストリーミングではなく、単一のMP4ファイルを徐々にダウンロードしています。私はそれを正しく理解していますか?

私は最近、RTPデータソースから実際のDASHライブストリーミングを行うために RTP2DASH プロジェクトを開始しました。それはまだ非常に「アルファ」ですが、単純なユースケースに簡単に採用できるはずです。

1