4

現在、VP8 と V4L2 を使用してビデオ ストリーミング ソフトウェアを開発していますが、フレーム レーティングの重要な概念に苦労しています。

フレームをループでフェッチし、エンコードしてRTP経由で送信する基本的な実装があります(可能な限り高速です)。しかし、ビデオのフレームレートを制御したり、サンプリングを調整したりする方法がわかりません。

基本的には次のように要約できます。

while (true) {
    ioctl(fd, VIDIOC_DQBUF, buf); // Get the V4L buffer
    vpx_codec_encode(...);        // VP8 encode using pts and timebase
    sendto();                     // Send through RTP with the correct timestamp
}

特に、適切に設定する方法がわかりません:

  • V4L2 キャプチャ ループ (定期的にフレームを取得するためにタイマーが必要ですか?)
  • V4L2 からの FRAME INTERVAL 設定 (必須ですか?)
  • libvpx タイムベース (1/fps ? 1001/30000 を使用する必要がありますか?)
  • ポイント値 (フレーム数 * (1/fps) * 90000 である必要がありますか?)
  • RTP タイムスタンプ (ここで pts を使用できますか?)
  • 考慮できるその他の構成設定...
4

1 に答える 1

1

V4L2 キャプチャ ループ (定期的にフレームを取得するためにタイマーが必要ですか?)

それか、新しいデータが到着するまでスレッドをブロックselect()する方法を見つける (例: を使用)

V4L2 からの FRAME INTERVAL 設定 (必須ですか?)

必須ではありません。FRAME_INTERVAL を設定するときは、指定した間隔でデータをサンプリングするようにデバイスに指示します。デバイスは単に要求を無視する場合があります (たとえば、指定されたサンプルレートでキャプチャできないため)。また、デバイスの内部クロックが不正確であったり、システム上の他のクロックと異なる場合があることに注意してください。

libvpx タイムベース (1/fps ? 1001/30000 を使用する必要がありますか?)

明らかにこれはフレームレートに依存します。

vpx-documentation はここで非常に明確です。

ストリームで使用される最小時間間隔 (秒単位) を示します。固定フレーム レートの素材、または特定のクロックの倍数でフレームのタイミングが調整される可変フレーム レートの素材 (例: ビデオ キャプチャ) の場合、推奨される方法は、タイムベースをフレーム レートの逆数 (例: 1001/30000) に設定することです。 29.970 Hz NTSC の場合)。これにより、ポイントをフレーム番号に対応させることができ、便利です。絶対時間タイムスタンプを使用してコンテナからビデオを再エンコードする場合、タイムベースを親コンテナまたはマルチメディア フレームワークのタイムベースに設定することをお勧めします (例: FLV のように ms の場合は 1/1000)。

タイムベースのタイプは であるためvpx_rational、2 つの整数の比率として表す必要があります。1/fpsたとえば、NTSC の変人レートには使用できません。

ポイント値 (フレーム数 * (1/fps) * 90000 である必要がありますか?)

いいえ、そうではありません(上記を参照)。のように簡単にできますframe_num

RTP タイムスタンプ (ここで pts を使用できますか?)

はい。

于 2013-07-27T14:06:59.670 に答える