C++ 使用FFmpeg API的示例C代码中的问题

C++ 使用FFmpeg API的示例C代码中的问题,c++,c,pointers,video,ffmpeg,C++,C,Pointers,Video,Ffmpeg,我一直在尝试将FFmpeg的示例代码更改为使用其C API调用其他过滤器。假设过滤器是freezetext=n=-60dB:d=8,通常运行方式如下: ffmpeg -i small.mp4 -vf "freezedetect=n=-60dB:d=8" -map 0:v:0 -f null - [freezedetect @ 0x25b91c0] lavfi.freezedetect.freeze_start: 5.005 [freezedetect @ 0x25b91c0] lavfi.fr

我一直在尝试将FFmpeg的示例代码更改为使用其C API调用其他过滤器。假设过滤器是
freezetext=n=-60dB:d=8
,通常运行方式如下:

ffmpeg -i small.mp4 -vf "freezedetect=n=-60dB:d=8" -map 0:v:0 -f null -
[freezedetect @ 0x25b91c0] lavfi.freezedetect.freeze_start: 5.005
[freezedetect @ 0x25b91c0] lavfi.freezedetect.freeze_duration: 2.03537
[freezedetect @ 0x25b91c0] lavfi.freezedetect.freeze_end: 7.04037
并按如下方式打印输出:

ffmpeg -i small.mp4 -vf "freezedetect=n=-60dB:d=8" -map 0:v:0 -f null -
[freezedetect @ 0x25b91c0] lavfi.freezedetect.freeze_start: 5.005
[freezedetect @ 0x25b91c0] lavfi.freezedetect.freeze_duration: 2.03537
[freezedetect @ 0x25b91c0] lavfi.freezedetect.freeze_end: 7.04037
但是,原始示例显示的是帧,而不是这些元数据信息。如何更改代码以打印此元数据信息(而不是框架)

我一直在尝试将下面的
display\u frame
函数更改为
display\u metadata
函数。看起来
frame
变量有一个
metadata
字典,看起来很有希望,但我的尝试失败了。我也是C语言新手

原始
显示框
功能:

static void display_frame(const AVFrame *frame, AVRational time_base)
{
    int x, y;
    uint8_t *p0, *p;
    int64_t delay;

    if (frame->pts != AV_NOPTS_VALUE) {
        if (last_pts != AV_NOPTS_VALUE) {
            /* sleep roughly the right amount of time;
             * usleep is in microseconds, just like AV_TIME_BASE. */
            delay = av_rescale_q(frame->pts - last_pts,
                                 time_base, AV_TIME_BASE_Q);
            if (delay > 0 && delay < 1000000)
                usleep(delay);
        }
        last_pts = frame->pts;
    }

    /* Trivial ASCII grayscale display. */
    p0 = frame->data[0];
    puts("\033c");
    for (y = 0; y < frame->height; y++) {
        p = p0;
        for (x = 0; x < frame->width; x++)
            putchar(" .-+#"[*(p++) / 52]);
        putchar('\n');
        p0 += frame->linesize[0];
    }
    fflush(stdout);
}

请参阅metadata.c示例。@Gyan谢谢。是的
av\u dict\u get(frame->metadata,“myfreezekey”,tag,0)
是一个救命稻草!但是我看到过滤器元数据
[freezetext@0x25b91c0]lavfi.freezetext.freeze\u start:5.005
也默认打印!有什么方法可以禁用它吗?没有,这是由过滤器提供并由av格式化的_log@Gyan知道了。真奇怪。我在过滤器C文件的
set\u meta
功能中删除
av\u log
。和制造。但仍然可以看到相同的日志打印。它不应该工作吗?