36

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

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

しかし、MP4 には長さを指定する必要があるメタデータ用の moov アトムがあるため、ライブ ストリーミングできないことがわかりました。FFMpeg は、moov をファイルの最後に配置するため、mp4 を stdout に直接ストリーミングすることはできません。( MP4 のライブ トランスコーディングとストリーミングは Android で動作しますが、Flash プレーヤーでは NetStream.Play.FileStructureInvalid エラーで失敗します)

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

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

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

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

mp4 ファイルを小さなパーツに分割して、ストリーミングできるようにすることはできますか?

もちろん、別のコンテナ/フォーマットに切り替えることもできますが、Flash と HTML5 の両方に対応する唯一のフォーマットは mp4/h264 であるため、両方をサポートする必要がある場合は、2 回トランスコードする必要があります。

4

4 に答える 4

21

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

moov [moof mdat]+

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

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

于 2013-01-28T08:37:18.620 に答える
4

これが私の考えです。一部は他の方法で正しいかもしれません。誰もこのプロセスを完全に文書化していないため、私は無知であることを認めます.

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

あるいは、m4v ストリームからの raw naul を使用して rtmp ストリームを構築することもできます。

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

データを取得する方法。

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

于 2012-12-10T19:42:56.390 に答える
2

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

于 2012-10-23T09:11:14.970 に答える
0

質問の 2 番目のパラグラフ (「ビデオは、サーバー上の ASF から ffmpeg によってトランスコードされています。」) を見るだけで、ffmpeg を使用してサーバー上のビデオをトランスコードしていると述べました。

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

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

于 2013-01-02T11:00:00.463 に答える