web-dev-qa-db-ja.com

MP4を介したライブストリーミング

私はオンラインTVサービスに取り組んでいます。目標の1つは、追加のブラウザプラグインなしでビデオを再生することです(Flashを除く)。

大部分のHTML5ブラウザーとFlash(フォールバック用)でサポートされているため、MP4を使用することにしました。ビデオは、サーバー上のASFからFFMpegによってトランスコードされます。

ただし、MP4には、長さを指定する必要があるメタデータのmoov atomがあるため、MP4をライブストリーミングできないことがわかりました。FFMpegは、ファイルの終わり。( MP4のライブトランスコーディングとストリーミングはAndroidで動作しますが、NetStream.Play.FileStructureInvalidエラーでFlashプレーヤーで失敗します

もちろん、MPEG-TSは存在しますが、HTML5ではサポートされていません<video>

私が考えたのは、ストリームをリアルタイムでMP4にトランスコードし、その新しいHTTPリクエストごとに、最初にビデオの長さに非常に長い数値を指定するmoovを送信し、次に残りの部分の送信を開始する方法ですMP4ファイル。

そのようにストリーミングするためにMP4を使用することは可能ですか?

いくつかの調査とav501の答えの後、フレームのサイズが機能するように知られている必要があることを理解しています。

Mp4ファイルは、ストリーミングできるように小さな部分に分割できますか?

もちろん、別のコンテナ/形式への切り替えはオプションですが、FlashとHTML5の両方と互換性のある形式はmp4/h264だけなので、両方をサポートする必要がある場合、2回トランスコードする必要があります。

34
Ivo

ここに私の考えは、その一部が他の方法で正しいかもしれないということです。このプロセスを完全に文書化した人は誰もいなかったので、私は無知を嘆きます。

AvAssetWriterはファイルにエンコードするだけで、エンコードされたビデオをメモリに取り込む方法はないようです。バックグラウンドスレッドから書き込み中にファイルを読み取ると、ソケットはエレメンタリストリームになります。これは基本的にm4vであり、h264/acc mdataを含むコンテナですが、moovアトムはありません。 (つまり、ヘッダーなし)いいえApple提供されたプレーヤーはこのストリームを再生できますが、ffplayに基づいて変更されたプレーヤーはストリームをデコードおよび再生できます。ffplayはlibavformatを使用するため、エレメンタリストリームをデコードできます。ファイル長の情報がないため、警告が1つあります。プレイ、DTSおよびPTSによって決定される必要があるものもあります。 。

または、m4vストリームからの生のnaulを使用して、rtmpストリームを構築できます。

さらに議論したい場合は、直接私に連絡することができます。

データを取得する方法。

とにかく受信側でファイルを再構築する必要があるので、ちょっとセグメント化できると思います、Steve Mcfarinはgithubページで見つけることができる小さなappleSegmentedEcorderを書きました。すべてのファイル情報があります。

4
Michelle Cannon

断片化されたMP4を使用できます。断片化されたMP4ファイルは次のように構築されます。

moov [moof mdat]+

Moovボックスには、トラックに関する基本情報(数、タイプ、コーデックの初期化など)のみが含まれ、トラック内のサンプルに関する情報は含まれません。サンプルの場所とサンプルサイズに関する情報はmoofボックスにあり、各moofボックスの後には、前述のmoofボックスで説明したサンプルを含むmdatが続きます。通常、(moof、mdat)ペアの長さは約2,4または8秒に選択します(これに関する仕様はありませんが、これらの値はほとんどのユースケースで妥当と思われます)。

これは、終わりのないMP4ストリームを構築する方法です。

20

いいえ、非常に長いだけではありません。mp4でヘッダーを作成するには、すべてのフレームの正確なサイズを知る必要があります。 [これが、さまざまなエンコーダーによって最後に作成される理由です]。

2
av501

質問の2番目の段落(「ビデオはffmpegによってサーバー上のASFからトランスコードされます。」)を見ると、ffmpegを使用してサーバー上のビデオをトランスコードしていることに言及しました。

Qt-faststartまたはMP4Boxを使用して、ファイルの先頭にMOOV atomを配置します。また、ユニバーサルサポートのためにH264ビデオおよびAACオーディオコーデックを使用することを確認してください)

これがお役に立てば幸いです。

0
mrsatish