我正在从ffmpeg中提取运动矢量以用于计算机视觉项目。我一直在寻找一种以有意义的方式提取这些信息的简单方法。
在阅读不同帖子和其他网站时,我遇到了FFmpeg示例文件夹中的extract_mvs.c。我注意到这个文件产生的数据(在编译之后)有一个我想修改的标志列,使其打印帧类型而不是0x0,如下所示。
我从the author of the code himself修改标记的想法。
编译后的extract_mvs.c文件,返回如下信息:
framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,flags
2,-1,16,16, 8, 8, 8, 8,0x0
2, 1,16,16, 8, 8, 8, 8,0x0
2, 1,16,16, 24, 8, 24, 8,0x0
2, 1,16,16, 40, 8, 40, 8,0x0
2, 1,16,16, 56, 8, 56, 8,0x0
2, 1,16,16, 72, 8, 72, 8,0x0
2, 1,16,16, 88, 8, 88, 8,0x0
...
297, 1,16,16, 248, 280, 248, 280,0x0
297, 1,16,16, 264, 280, 264, 280,0x0
297,-1,16,16, 278, 279, 280, 280,0x0
297, 1,16,16, 280, 280, 280, 280,0x0
297, 1,16,16, 296, 280, 296, 280,0x0
297, 1,16,16, 312, 280, 312, 280,0x0
297, 1,16,16, 328, 280, 328, 280,0x0
297, 1,16,16, 344, 280, 344, 280,0x0
理想情况下,我想要实现的目标是:
framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,frametypes
2,-1,16,16, 8, 8, 8, 8,B
2, 1,16,16, 8, 8, 8, 8,B
2, 1,16,16, 24, 8, 24, 8,B
2, 1,16,16, 40, 8, 40, 8,B
2, 1,16,16, 56, 8, 56, 8,B
2, 1,16,16, 72, 8, 72, 8,B
2, 1,16,16, 88, 8, 88, 8,B
...
297, 1,16,16, 248, 280, 248, 280,P
297, 1,16,16, 264, 280, 264, 280,P
297,-1,16,16, 278, 279, 280, 280,P
297, 1,16,16, 280, 280, 280, 280,P
297, 1,16,16, 296, 280, 296, 280,P
297, 1,16,16, 312, 280, 312, 280,P
297, 1,16,16, 328, 280, 328, 280,P
297, 1,16,16, 344, 280, 344, 280,P
需要修改文件is shown here的部分,其中 mv-> flags 需要替换为帧类型变量。我想过用指针引用AVFrame结构并调用pict类型。但不确定构建块是如何形成的。有什么帮助吗?
答案 0 :(得分:0)
我设法找出如何用帧类型替换标志。我只是将this line print function更改为:
printf("%d,%2d,%2d,%2d,%4d,%4d,%4d,%4d,%c\n",
video_frame_count, mv->source,
mv->w, mv->h, mv->src_x, mv->src_y,
mv->dst_x, mv->dst_y, av_get_picture_type_char(frame->pict_type));
然后,您可以change this line for the header 标记来阅读框架类型:
printf("framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,frametypes\n")