でエンコードされたビデオが.3gp
h.264
あり、C でそのフレームレートとデュレーションを取得しようとしています。ファイルを開いて適切なコーデックを見つけた後に使用するコードは次のとおりです。
AVRational rational = gVideoCodecCtx->time_base;
LOGI(10, "numerator is %i", rational.num);
LOGI(10, "denominator is %i", rational.den);
LOGI(10, "duration is %d", gFormatCtx->duration);
LOGI(10, "fps is %d", (double)av_q2d(rational));
出力は次のとおりです。
12-02 12:30:19.819: I/FFmpegTest(23903): numerator is 1
12-02 12:30:19.819: I/FFmpegTest(23903): denominator is 180000
12-02 12:30:19.819: I/FFmpegTest(23903): duration is 6594490
12-02 12:30:19.819: I/FFmpegTest(23903): fps is 1692926992
ドキュメントから、期間が「duration/time_base」であることを意味していることを理解しています6594490 / 180000 = 36.6
。ビデオ ファイルの長さは です。6 seconds
この要素がどこから来るのかわかりません6
。
また、フレームレートは完全にオフになっているようです。
現在、多くのチュートリアルで非推奨の方法が使用されており、ドキュメントに例が記載されていないため、ヘルプを見つけるのは非常に困難です。
どんな助けでも大歓迎です。
ありがとう
編集: 以下のコメントのおかげで、私は以下を印刷することができました
12-02 18:59:36.279: I/FFmpegTest(435): numerator is 1
12-02 18:59:36.279: I/FFmpegTest(435): denominator is 180000
12-02 18:59:36.279: I/FFmpegTest(435): duration is 6594490
12-02 18:59:36.279: I/FFmpegTest(435): fps is 0.000006
私はまた、これでフレームのタイムスタンプを見つけることができましたmsec
:
int msec = 1000*(packet.pts * timeBase * gVideoCodecCtx->ticks_per_frame);
これは、おおよそのものを返します33fps
(私は期待しています30
)。しかし、期間を取得する方法がわかりません。ドキュメントには「ストリームの継続時間、AV_TIME_BASE
小数秒」と記載されていますが6594490 * 0.000006 = 39.5
、正しい継続時間は6.3
秒です)。また、正確な fps はわかり30
ませんが、上記の数値0.000006
からどのように取得するかはわかりません)30
ありがとう