3

類似の投稿と重複しないようにしてください。

N 番目のフレーム、たとえば 7 番目のフレームを見つけてデコードしたい。

私が理解したように、time_base各フレームのティック数を計算することができ、それを 7 倍すると 7 番目のフレームの位置が得られます。私が行うティックを計算するには

AVStream inStream = getStreamFromAVFormatContext();

int fps = inStream->r_frame_rate.num;
AVRational timeBase = inStream->time_base;

int ticks_per_frame = (1/fps) / timeBase;
int _7thFramePos = ticks_per_frame * 7;
  1. 7 番目のフレームの位置を正しく計算しましたか? もしそうなら、そのフレームに行くには するだけですav_seek_frame(pFormatCtx, -1, _7thFramePos, AVSEEK_FLAG_ANY)よね?7 番目のフレームが P フレームまたは B フレームの場合、どうすればデコードできますか?
  2. 計算値が と異なることに気付きましたinStream->codec->ticks_per_frame。なぜですか? それらは同じであるべきではありませんか?違いはなんですか?
4

1 に答える 1

1

この投稿は問題をうまく説明しています。 http://www.hackerfactor.com/blog/index.php?/archives/307-Picture-Go-Back.html

[1] AVStream構造のコメントは、「r_frame_rate」は推測であり、正確ではない可能性があることを明確に述べています.25fpsのフレームレートを持っていても、base_timeに関しては、1秒間に24または26フレームになる可能性があるためです。 .

[2] 正確なフレーム番号を見つけるには、フレームを最初からデコードしてカウンターを保持する必要がありますが、これは非常に非効率的です。これは、すべてのフレームに関する情報がファイルに存在する MP4 などの一部のファイル形式に最適化できます。 -ヘッダ。

于 2013-01-01T13:21:30.120 に答える