gpt4 book ai didi

c - av_dump_format 获得正确的 fps,试图复制其源代码不会

转载 作者:行者123 更新时间:2023-12-04 23:19:10 26 4
gpt4 key购买 nike

我正在尝试使用 FFmpeg 库来处理视频文件,我需要获取视频的 fps。我正在以恒定的 fps 加载 mp4 h264 视频。
我的代码是 demuxing and decoding example 的稍微修改的副本.我删除了用于输出视频和音频的代码,以及所有与音频相关的东西。 open_codec_context除了删除音频内容外,功能没有变化。
调用open_codec_context后,我的代码执行以下操作:

if(open_codec_context(&video_stream_idx, &video_dec_ctx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0)
{
video_stream = fmt_ctx->streams[video_stream_idx];

double fps = get_fps(video_stream);

printf("Framerate: %f\n", fps);
}

av_dump_format(fmt_ctx, 0, src_filename, 0);
av_dump_format将视频流的 fps 打印为: 25 fps, 25 tbr, 12800 tbn, 50 tbc我查了 source for av_dump_format , 对于每个流它调用 dump_stream_format ,除其他外,它执行以下操作:
static void dump_stream_format(const AVFormatContext *ic, int i, int index, int is_output)
{
// (...)
const AVStream *st = ic->streams[i];
// (...)

// The part where it actually prints the fps
if(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
{
int fps = st->avg_frame_rate.den && st->avg_frame_rate.num;
int tbr = st->r_frame_rate.den && st->r_frame_rate.num;
int tbn = st->time_base.den && st->time_base.num;

if (fps || tbr || tbn)
av_log(NULL, AV_LOG_INFO, "%s", separator);

if (fps)
print_fps(av_q2d(st->avg_frame_rate), tbr || tbn ? "fps, " : "fps");
if (tbr)
print_fps(av_q2d(st->r_frame_rate), tbn ? "tbr, " : "tbr");
if (tbn)
print_fps(1 / av_q2d(st->time_base), "tbn");
}

// (...)
}
所以我将逻辑复制到 get_fps功能:
static double get_fps(AVStream *st)
{
int fps = st->avg_frame_rate.den && st->avg_frame_rate.num;
int tbr = st->r_frame_rate.den && st->r_frame_rate.num;
int tbn = st->time_base.den && st->time_base.num;

if(fps) return av_q2d(st->avg_frame_rate);
if(tbr) return av_q2d(st->r_frame_rate);
if(tbn) return 1.0 / av_q2d(st->time_base);
}
但它返回的结果是无稽之谈。
我让我的代码只打印 avg_frame_rate 的值, r_frame_ratetime_base并得到: avg_frame_rate每次我运行它时都有随机值(包括负数),看起来像初始化垃圾。 r_frame_rate是 0/0。 time_base也有随机值,如 avg_frame_rate .

有谁知道发生了什么? av_dump_format如何得到正确的fps?
我尝试了不同的视频文件,结果相同。

最佳答案

好的,所以我已经弄清楚问题出在哪里了。
我从源代码(主)构建了 ffmpeg,我一定搞砸了配置,因为缺少一些东西。链接器非常有帮助地从我的包管理器(稳定版 4.4.1)中找到了我的常规 ffmpeg 中缺少的库。所以我的程序链接到半主和半 4.4.1,导致未定义的行为。
原来我得到的随机值来自那个未定义的行为。与稳定的 4.4.1 版本链接直接修复了问题,现在我 get_fps返回预期值。
我很惊讶我没有注意到就走到了这一步。甚至没有段错误。

关于c - av_dump_format 获得正确的 fps,试图复制其源代码不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70500219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com