在 libavformat 中设置 "re" 标志
Set "re" flag in libavformat
我们如何在使用 libavformat 和 libavcodec 库的 C++ 代码中设置 re 标志。
我需要在我的 C++ 应用程序中实现类似以下命令的东西
ffmpeg -re -f m4v -i video.264 -vcodec copy out.mp4
我已经实现并测试了上述命令,但没有 re 标志。我需要我的应用程序在编码时以相同的速率读取帧。
"re" 标志设置 InputFile->rate_emu 标志。它的出现可见于ffmpeg_opt.c.
InputFile 是 ffmpeg.h 的本地结构,表示 "re" 标志在 libavcodec 或 libavformat 中都没有用。
根据如何使用该功能,如果您查看 ffmpeg_opt.c
{ "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
OPT_INPUT, { .off = OFFSET(rate_emu) },
"read input at native frame rate", "" },
然后查看
ffmpeg.c
static int get_input_packet(InputFile *f, AVPacket *pkt)
{
if (f->rate_emu) {
int i;
for (i = 0; i < f->nb_streams; i++) {
InputStream *ist = input_streams[f->ist_index + i];
int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
int64_t now = av_gettime_relative() - ist->start;
if (pts > now)
return AVERROR(EAGAIN);
}
}
#if HAVE_PTHREADS
if (nb_input_files > 1)
return get_input_packet_mt(f, pkt);
#endif
return av_read_frame(f->ctx, pkt);
}
如果设置了 "rate_emu" 标志,get_input_packet 会重新缩放点并检查是否到了读取帧的时间。如果时间合适,它会读取其他帧,returns 两手空空。所以感觉就像我们正在以原生帧速率获取它。如果没有设置rate_emu,代码直接跳转到“av_read_frame
我们如何在使用 libavformat 和 libavcodec 库的 C++ 代码中设置 re 标志。 我需要在我的 C++ 应用程序中实现类似以下命令的东西
ffmpeg -re -f m4v -i video.264 -vcodec copy out.mp4
我已经实现并测试了上述命令,但没有 re 标志。我需要我的应用程序在编码时以相同的速率读取帧。
"re" 标志设置 InputFile->rate_emu 标志。它的出现可见于ffmpeg_opt.c.
InputFile 是 ffmpeg.h 的本地结构,表示 "re" 标志在 libavcodec 或 libavformat 中都没有用。
根据如何使用该功能,如果您查看 ffmpeg_opt.c
{ "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
OPT_INPUT, { .off = OFFSET(rate_emu) },
"read input at native frame rate", "" },
然后查看
ffmpeg.c
static int get_input_packet(InputFile *f, AVPacket *pkt)
{
if (f->rate_emu) {
int i;
for (i = 0; i < f->nb_streams; i++) {
InputStream *ist = input_streams[f->ist_index + i];
int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
int64_t now = av_gettime_relative() - ist->start;
if (pts > now)
return AVERROR(EAGAIN);
}
}
#if HAVE_PTHREADS
if (nb_input_files > 1)
return get_input_packet_mt(f, pkt);
#endif
return av_read_frame(f->ctx, pkt);
}
如果设置了 "rate_emu" 标志,get_input_packet 会重新缩放点并检查是否到了读取帧的时间。如果时间合适,它会读取其他帧,returns 两手空空。所以感觉就像我们正在以原生帧速率获取它。如果没有设置rate_emu,代码直接跳转到“av_read_frame