5

でエンコードされたビデオが.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

ありがとう

4

2 に答える 2

1

FPS は次の方法で取得できます。

const double FPS = (double)videoStream->r_frame_rate.num / (double)videoStream->r_frame_rate.den;

どこにvideoStreamある:

AVFormatContext * format = NULL;
if ( avformat_open_input( & format, "my_video.mkv", NULL, NULL ) != 0 ) ) on_error();
if ( avformat_find_stream_info( format, NULL ) < 0) on_error();
//av_dump_format( format, 0, "my_video.mkv", false );
AVCodec * video_dec = (AVCodec*)1;
const auto video_stream_index = av_find_best_stream( format, AVMEDIA_TYPE_VIDEO, -1, -1, & video_dec, 0 );
if ( video_stream_index < 0 ) on_error();
const auto videoStream = format->streams[ video_stream_index ];
于 2020-03-14T01:16:27.760 に答える
-2

%d ではなく %lf であるはずなので、fps プリントはガベージです。他のパラメータの型も一度確認してみてはいかがでしょうか。

于 2012-12-02T18:44:19.747 に答える