7

h264 RTP パケットのタイムスタンプについて混乱しています。ビデオのウォール クロック レートは、SIP SDP で定義した 90KHz であることを知っています。私のエンコーダーのフレームレートは正確に 30 FPS ではなく、可変です。オンザフライで 15 FPS から 30 FPS まで変化します。したがって、固定のタイムスタンプは使用できません。

次のエンコードされたパケットのタイムスタンプを教えてください。
0 ミリ秒後、エンコードされた RTP タイムスタンプ = 0 (開始タイムスタンプを 0 とする)
50 ミリ秒後、エンコードされた RTP タイムスタンプ = ?
40 ミリ秒後にエンコードされた RTP タイムスタンプ = ?
33 ミリ秒後にエンコードされた RTP タイムスタンプ = ?

エンコードされたフレーム レートが可変の場合の計算式は?

前もって感謝します。

4

3 に答える 3

14

エンコーダーがビデオを 10FPS でエンコードするか 30FPS でエンコードするかは関係ありません。RTP タイムスタンプを使用して、2 つのフレーム間の一時停止の長さを受信者に伝えます。そのため、フレームごとにその場で決定します。そうすれば、1 秒間に 10 フレーム (10 fps) を送信でき、1 秒間に 30 フレーム (30 fps) を送信できます。RTP タイムスタンプを正しく設定するだけで済みます。そして、私があなたの質問を受け取ったら、あなたはこれを行う方法を疑っています...

開始タイム スタンプを 0 にして、最後の RTP タイムスタンプに 100 を掛けたミリ秒単位の壁時計時間を追加するか、任意のタイム スケールを使用できます。デコーダーに 10fps ビデオを 30fps でデコードさせるには、各パケットの RTP タイムスタンプに 333000 を追加します...ただし、例を見てみましょう:

Frame #      RTP Time   Time between frames [ms]
[  1]               0   0
[  2]           50000   50
[  3]           90000   40
[  4]          420000   33  

したがって、このように RTP タイムスタンプを設定(Time in ms * 100000)すると、デコーダがフレーム 1 をロードしてデコードし、次にフレーム 2 をロードしてデコードしますが、フレーム 2 を描画する前に 50 ミリ秒 (フレーム 1 とフレーム 2 の時間差) スリープします。 、 等々...

ご覧のとおり、デコーダーは RTP タイムスタンプを使用して各タイムスタンプをいつ表示するかを判断し、ビデオが 30 fps でエンコードされたか 10 fps でエンコードされたかを気にしません。

また、ビデオが 30 fps の場合、1 秒あたり 30 の RTP パケットがあるという意味ではありません。場合によっては 100 を超えることがあるため、正しい RTP タイムスタンプ計算を保証する数式を使用することはできません。

私はこれがあなたが必要としているものだと思います...私が助けてくれることを願っています.

于 2010-05-30T22:35:43.297 に答える
6

これには簡単な公式はありません。

エンコード前のフレームのサンプリングに使用される瞬間は、PTS (プレゼンテーション タイムスタンプ) と呼ばれます。これはエンコーダの範囲外です。フレームをキャプチャするときは、データ フローで覚えておく必要があります。

そこから、2 つの可能性があります。

  1. H264 エンコーダーは B フレームを生成しないため、RTP タイムスタンプは PTS + ランダム オフセット (すべてのストリーミング セッションで同じ) である必要があります。
  2. エンコーダーが B フレーム (または B スライス) を生成する場合、B フレームは次のフレームをデコードする必要があるため、デコード順序を変更する必要があります。

後者の場合、RFC6184 は、エンコードされた NAL ユニットをストリーミングする方法が複数あると述べています。

ほとんどのストリーミング ソフトウェアは、「ノン インターリーブ」と呼ばれるモードを使用します。このモードでは、RTP タイムスタンプを PTS + オフセットに設定する必要がありますが、タイムスタンプが単調に増加しないようにデコード順に送信する必要があります。これは、クライアントが受信した順序でデコードする必要があり、PTS 順序でフレームを並べ替えないことも意味します。

ここでDTSという用語を使用していないのには理由があります。これが機能するためにデコードのタイムスタンプは必要なく、順序だけが必要だからです。

RFC6184 で説明されている最後のモードは、NAL ユニットの順序を変更できる、いわゆるインターリーブ順序です。その場合、ユニットを並べ替えるためにいくつかのアプリケーション ロジックを実装する必要があります。詳細については、RFC6184 を参照してください。

于 2017-01-09T15:02:58.403 に答える