ffmpeg пишет в контейнер mp4 неверный fps (а в avi верно). В чем причина?
Мне нужно записывать кадры в реальном времени. Для тестирования этой ситуации я делаю pts нелинейным (так как кадры могут теряться), таким образом:
// AVFrame
video_frame->pts = prev_pts + 2;
Для записи в файл использую libavformat. Параметры AVCodecContext и AVStream
#define STREAM_FRAME_RATE 25
#define CODEC_PIX_FMT AV_PIX_FMT_YUV420P
#define FRAME_WIDTH 1440
#define FRAME_HEIGHT 900
// AVCodecContext
cc->codec_id = video_codec->id;
cc->bit_rate = 400000;
cc->width = FRAME_WIDTH;
cc->height = FRAME_HEIGHT;
cc->gop_size = 12;
cc->pix_fmt = CODEC_PIX_FMT;
// AVStream
video_stream->time_base = AVRational{ 1, STREAM_FRAME_RATE };
cc->time_base = video_stream->time_base;
cc->framerate = AVRational{ STREAM_FRAME_RATE , 1 };
Запись в файл:
static int write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AVStream *st, AVPacket *pkt)
{
/* rescale output packet timestamp values from codec to stream timebase */
//av_packet_rescale_ts(pkt, *time_base, st->time_base);
pkt->pts = av_rescale_q(pkt->pts, *time_base, st->time_base);
pkt->dts = av_rescale_q(pkt->dts, *time_base, st->time_base);
pkt->stream_index = st->index;
/* Write the compressed frame to the media file. */
//log_packet(fmt_ctx, pkt);
//return av_write_frame(fmt_ctx, pkt);
return av_interleaved_write_frame(fmt_ctx, pkt);
}
Если использовать контейнер avi, то в файле информация о кол-ве кадров в секунду указывается верно: 25 fps
Если использовать контейнер mp4, то в файле информация о кол-ве кадров в секунду указывается неправильно: 12,5 fps
Подскажите, пожалуйста, какие ещё настройки необходимо добавить?

