オーディオとビデオの同期における PCR の役割を簡単に説明します。

PCR 同期は、ハードウェア以外の正確なクロック ソースの場合、依然として注意して使用されます. PCR 同期は gstreamer で使用されますが、多くの ffmpeg 転送クリップ、または CP 側のクリップ ソース、PCR が非常に粗いことがわかりました。コマ飛び等が必ず発生する現象です。

オーディオとビデオの同期は、ビデオ同期オーディオ、オーディオ同期ビデオ、外部クロックへの同期の 3 つの方法があります。

3つ目は外部クロックに同期させる方法で、先ほどの同期方法と同じPCR同期です!

最もよく使われるのは、オーディオとビデオの同期です。なぜですか? 音声のサンプリングレートは固定です. 音声が少し引っかかるとはっきりと聞こえます. そうしないとビデオはそうではありません. 表面は30fpsと言われていますが, 各フレームの間隔は必ずしもそうではありません33.33 ミリ秒の精度である必要があります。人間の目では観察できないため、ビデオのフレーム レートは動的であり、厳密には標準ではありません。

オーディオとビデオの同期は簡単です。まず、オーディオ スレッドは、それを個別にデコードして再生します。ビデオ スレッドは、表示する前に、ビデオ PTS がオーディオ PTS より大きいかどうかを検出する必要があるだけです.大きい場合は、オーディオ PTS >= ビデオ PTS を待ちます.小さい場合は、直接再生されます.大きすぎる場合小さい場合は、直接破棄できます (フレーム スキップ)。それはとても簡単です!ただし、前提として、エンコーダーには正しい PTS が必要です。そうでない場合は、PTS を自分で偽造するしかありません。

オーディオとビデオの同期とフレーム レート制御は、実際には 1 つのことです。オーディオとビデオの同期が何であれ、フレーム レートを制御する方法を見てみましょう。フレーム レート コントロールを理解し、オーディオとビデオの同期の基本を理解します。

1. フレームレート制御

フレームレート制御の方法は何万通りもあり、2つ目はフレームをデコード・表示するたびに遅延させる方法ですが、フレームレート制御を行いながら音声と映像の同期を分かりやすくするために、ここではPCR同期を使用します。フレームレートを制御する方法。インターネット上では PCR 同期の原理について多くのことが語られていますが、その中には非常に理解しにくく、まったく普及していないものもあります。

理解のために 1280x720@30p のビデオ ソースを使用します。30P は毎秒 30 フレームを意味します。つまり、各フレームには 1/30*1000 ミリ秒が必要です。つまり、33.33 ミリ秒ごとに 1 フレームを表示する必要があります。

正しくデコードする方法を知るには、まずエンコード側の仕組みを理解する必要があります! 一般に, エンコーダーは 27MHZ のクロックでエンコードします. これらは重要ではありません. 重要なことは, エンコーダーは一般にデフォルトで 30ms ごとに PCR 情報を送信することです. ここでの PCR 情報は非常に重要です. 彼はデコード側の私たちです.フレームレート制御をデコードするための時間基準点は、将来の同期キャリブレーションのキャリブレーション基準点でもあります。

そんなに言ったので、分析と分析のためにPCR情報を取得します。PCR 情報は 33 ビットからなる int64 データで、デマルチプレクサからは非常に大きな数が得られますが、もちろんこれは理解できません。しかし、この数値がどのように生成されたかを知っていれば、はるかに理解しやすいでしょう!

端的に言えば、PCR 情報はビデオのタイムスタンプ情報です. たとえば、映画は (00:01:23:033) 時間: 分: 秒: ミリ秒から始まり、このタイム ベース ポイントで生成された PCR 情報は (((00* 60+1)*60+23.033)*90K)%2^33 です。90K は 27M で、周波数を 300 で除算した結果です。先ほど、PCR は 30ms ごとに更新されると言いましたので、PCR の増分の値は毎回 0.030*90K=2700 であり、これは PTS の値の原則と同じです.ここで言及させてください。重要ではありません。必要なのは最初の PCR 値が OK であることだけですが、後のキャリブレーションが考慮される場合は、後続の PCR 値が引き続き使用されます。ここでキャリブレーションの問題を忘れてください!

PCR といえば、PTS という別の値が必要です。実際、ハード デコーダーの場合、DTS 情報を気にする必要はまったくありません. フレームごとにデータを送信するだけでよく、ちなみに、各フレームの PTS 情報を送信すると、デコーダーが送信しますPTS情報(ffmpeg)のフレーム。逆多重化後の各フレームの PTS を出力してみると、逆多重化後、一般的に 9000 3000 6000 18000 12000 15000 のように配置されていることがわかります。これは、AVC エンコードの使用予測によって決定されます。コーディング. 気にする必要はありません. この方法で各フレームをデコーダーに送信するだけです. デコーダーが出力をデコードした後, 自然に 3000 6000 9000 12000 15000 18000 に配置されます. これが必要な PTS です!実はPTSの原理はPCRと似ていますが、PTSの増分値がデフォルトの30msではなく、動画のフレームレートで決まるところがポイント!大事なところといえば!上記の PCR の原理に従って、30p ビデオの場合、各フレームは 1/30 の増分であり、90K = 3000 で乗算されます。

率直に言うと、この PTS 値を同期とフレーム レート制御に使用しています。

ここからが肝心!

ここでビデオ ストリームが来ると、まず最初の PCR 値 1230000 を取得し、すぐにデコーダ側で 90K クロックを再構築します。ここがポイントです.90Kクロックを再構築する方法は、ハッキリ言ってタイマーを起動することです.タイミングは1/90K(11.11us)です.11.11usごとにPCRカウント値を1加算します. . 同時に、デコーダーも動作中、30P ビデオ、つまり 33.33ms に 1 回表示される場合を想像してみてください。そうです、33.33ms/11.11us=3000、この増分は PTS の増分とまったく同じではありません! このとき、現在のフレームの PTS がこの PCR と等しいかどうかをデコード スレッドで判断するだけでよく、等しい場合は表示され、PCR が大きい場合は現在のフレームが破棄されます。つまり、フレームはスキップされます. PCR が小さい場合、デコードは高速です. その後、タイマー スレッドが PCR==PTS になるのを待つことができます.

これは、フレーム レート制御の問題に対する非常に賢い解決策です。同様に、オーディオとビデオの同期も可能です。オーディオのPTSを作成してPCRと比較できます!実際、ほとんどの場合、オーディオはビデオと同期しており、オーディオのデコードは気にしません. 直接デコードして再生しても問題ありません. フレームレートを制御するだけでOK! 同時に、時間の経過とともに遅延が発生する可能性があることに注意してください。そのため、この時点で再度 PCR を取得して、タイマー スレッドの PCR ベース値を更新する必要があります。

この記事の利点は、C++ オーディオおよびビデオ学習キット、技術ビデオ(オーディオおよびビデオ開発、インタビューの質問、FFmpeg webRTC rtmp hls rtsp ffplaysrs など) ↓↓↓↓↓↓以下を参照してください↓↓記事下部の受信をクリック↓↓

おすすめ

転載: blog.csdn.net/m0_60259116/article/details/126427087