Проблемы в моем примере кода C с использованием FFmpeg API - PullRequest
1 голос
/ 11 июля 2019

Я пытался изменить пример кода 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);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...