Я пытался изменить пример кода 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);
}