首页 > 解决方案 > 使用 FFmpeg API 的示例 C 代码中的问题

问题描述

我一直在尝试更改 FFmpeg 的示例代码以使用其 C API调用其他过滤器。说过滤器freezedetect=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

但是,原始示例显示的是帧,而不是这些元数据信息。如何更改代码以打印此元数据信息(而不是帧)?

我一直在尝试将display_frame下面的函数更改为display_metadata函数。看起来该frame变量有一个metadata看起来很有希望的字典,但我的尝试未能使用它。我也是 C 语言的新手。

原始display_frame功能:

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);
}

display_metadata需要完成的新功能:

static void display_metadata(const AVFrame *frame)
{

//    printf("%d\n",frame->height);

    AVDictionary* dic = frame->metadata;

    printf("%d\n",*(dic->count));

//    fflush(stdout);
} 

标签: c++cpointersvideoffmpeg

解决方案


推荐阅读