c++ - 使用 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);
}
解决方案
推荐阅读
- sharepoint - 如何在共享点的文档库中禁用特定用户的打印选项?
- android - 当依赖库使用 AndroidX 库时,使用 Android 支持库的 Android 项目崩溃
- java - AnnotationSet 方法 get 没有返回集合
- cmd - 如何在 NET USER 命令中查看完整的组名
- kubernetes - 更新 Kubernetes 集群证书
- c# - c# - 尝试使用位图捕获屏幕
- amazon-cloudwatch - 通过仪表板可视化 AWS CloudWatch 上的日志计数
- ios - 可扩展标签:在 UICollectionViewCell 中不起作用
- kubernetes - 多个 Kubernetes NodePort 服务可以共享同一个后端目标吗?
- reactjs - 当我仅使用 3 个组件时,Antd 的 2.7 mb budle 大小