8

IBBP... GOP シーケンスを使用する mpeg ストリームを使用しています。最初の(DTS,PTS)4 つの AVPackets に対して返される値は次のとおりです。I=(0,3) B=(1,1) B=(2,2) P=(3,6)

I フレームの PTS は正当であるように見えますが、PTS 値が示すように B フレームは I フレームの前に表示されるべきではないため、B フレームの PTS は正しいとは言えません。また、パケットをデコードし、結果の AVFrame で pts 値を使用してみました。PTS は常にゼロに設定されています。

ffmpeg から正確な PTS を取得する方法はありますか? そうでない場合、オーディオを同期する最良の方法は何ですか?

4

3 に答える 3

11

http://www.dranger.com/ffmpeg/tutorial05.htmlで行われたコメントに基づいて、私は最終的に何が起こっているのかを理解したと思います:

ffmpegは、avcodec_decode_video()によって処理されているパケットのDTSが、返されるフレームのPTSと常に同じになるように、パケットを並べ替えます。

翻訳:PTSが12のavcodec_decode_video()にパケットをフィードした場合、avcodec_decode_video()は、DTSが12の新しいパケットをフィードするまで、そのパケットに含まれるデコードされたフレームを返しませ。そのDTSと同じ場合、与えられたパケットは返されたフレームと同じです。パケットのPTSがDTSより2フレーム遅れている場合、avcodec_decode_video()はフレームを遅延させ、さらに2つのパケットを提供するまでフレームを返しません。

この動作に基づいて、av_read_frame()はおそらくIPBBからIBBPにパケットを並べ替えているので、avcodec_decode_video()は5ではなく3フレームのPフレームをバッファリングするだけでよいと推測しています。この順序でのPフレームの出力は3(6-3)です。

|                  I B B P B B P
|             DTS: 0 1 2 3 4 5 6
| decode() result:       I B B P

対標準の順序(6-1)との5の違い:

|                  I P B B P B B
|             DTS: 0 1 2 3 4 5 6
| decode() result:       I B B P

<肩をすくめる/>しかし、それは純粋な推測です。

于 2008-09-19T19:39:45.907 に答える
2

わかりました、以前の混乱した返信をスクラッチします。

IBBPBBI ムービーの場合、PTS は次のようになります (デコード順)。

0, 3, 1, 2, 6, 4, 5, ...

フレームに対応

I, P, B, B, I, B, B, ...

したがって、シーケンスの開始時に I が欠落しているように見えますが、それ以外の場合、タイムスタンプは正しく見えます。

于 2008-09-18T21:03:16.583 に答える
0

正確な値を取得していると確信しています。MPEGストリームをストリームと見なすと役立つ場合があります。その場合、表示される IBBPBB の前に、通常は別の GOP があります。おそらく次のようなものです(元の質問と同じ表記法を使用):

P(-3,-2)  B(-2,-1)  B(-1,0)

基本的に、I フレームの後の B フレームは、前のGOPの I フレームと最後の P フレームに基づいています。

ビデオがこれで始まるのは論理的に理にかなっていますが:

Start GOP: IPBBPBBPBB...

後でそれはあるに違いない

Start GOP: IBBPBBPBBPBB
Start GOP: IBBPBBPBBPBB
Start GOP: IBB... 

B フレームをデコードするには、その前後に完全なフレームが必要であることに注意してください。したがって、B フレームの各ペアは、ファイル内でその直前の I フレームまたは P フレームの前に表示する必要があります。

FFMPEG は、最初の GOP の「特殊なケース」を忘れてしまったのかもしれません。

最初の 2 つの B フレームには操作する前のフレームがないため、安全に破棄できるはずです。タイムスタンプを最初の I フレームからリベースし、オーディオ ストリームを同じ量だけ調整します。

これにより実際にフレームが失われるかどうかは、FFMPEG の実装によって異なりますが、最悪のシナリオでは、83 ミリ秒 (24 フレーム/秒で 2 フレーム) 失われます。

于 2008-09-20T15:23:04.517 に答える