ffmpeg中的渐进式或隔行扫描检测

时间:2014-07-24 22:59:09

标签: ffmpeg

我正在尝试使用ffmpeg编写解码器,我想显示一些有关视频流的信息。我可以仅在解码帧之后检测帧是渐进的还是隔行扫描的(tff,bff)。即,

avcodec_decode_video2(pCodecCtx, pFrame, &gotFrame, &packet);
.....(assume we have a frame) 
.....
// print information
printf("prog=%d inter=%d", !pFrame->interlaced_frame, pFrame->interlaced_frame);

这很有效。

但我想知道是否有一种方法可以从AVFormatContext,AVCodecCtx或AVCodec结构或其他一些函数中检测到这种情况。这将是非常有用的,例如,如果文件是隔行扫描,我想中止解码。我不想解码一个帧来获取这条信息。

我正在尝试支持MPEG2,H.264 / AVC和HEVC编解码器(基本流或MP4容器)。

对不起,如果这是一个微不足道的问题!非常感谢你!

2 个答案:

答案 0 :(得分:4)

ffmpeg可以在“ idet”(隔行检测)模式下运行,并提供在文件中找到的帧类型的摘要。我使用:

$ ffmpeg -filter:v idet -frames:v 360 -an -f rawvideo -y /dev/null -i HitchhikersGuide.mp4

(带有idet滤镜的ffmpeg,采样360帧,使用原始视频格式阻止音频,使用输入文件HitchhikersGuide.mp4将输出发送到/ dev / null)

生成的报告包含(部分):

[Parsed_idet_0 @ 0x7fd5f3c121c0] Repeated Fields: Neither:   360 Top:     0 Bottom:     0
[Parsed_idet_0 @ 0x7fd5f3c121c0] Single frame detection: TFF:    30 BFF:     0 Progressive:   330 Undetermined:     0
[Parsed_idet_0 @ 0x7fd5f3c121c0] Multi frame detection: TFF:    22 BFF:     0 Progressive:   338 Undetermined:     0

在这种情况下,92%的采样帧是逐行的,而8%是隔行扫描的,因此大多数服务将其称为隔行视频。 TFF和BFF分别是Top-Field-First和Bottom-Field-First,都表示隔行扫描的帧。

请注意,可以将隔行视频编码为逐行,将逐行视频编码为隔行,并且此方法将仅报告编码。如果您想知道视频最初是隔行扫描的还是逐行扫描的,那么您将需要目视检查并寻找“梳理”效果,在这种情况下,交替的行不会彼此对齐(特别是在摄像机快速移动时) ),如果您看到了梳理,则原始视频将被隔行扫描。

答案 1 :(得分:0)

您可以使用ffprobe随附的ffmpeg。我不知道如何从库中使用它,但是命令行版本可以显示field_order。 带有一些其他字段的示例:

$ ffprobe -v quiet -select_streams v stream=codec_name,height,width,pix_fmt,field_order -of csv=p=0 "$Your_File"
prores,1920,1080,yuva444p12le,progressive
h264,1920,1080,yuv420p,unknown              # some progressive files show unknown
prores,720,576,yuv422p10le,tb               # tb = interlaced TFF interleaved
mpeg2video,1920,1080,yuv422p,tt             # tt = interlaced TFF
dvvideo,720,576,yuv420p,bt                  # bt = interlaced BFF interleaved

另一个选择是Mediainfo

mediainfo --Inform='Video;%ScanType%,%ScanOrder%,%ScanType_StoreMethod%' "$Your_File"
Progressive,,
Interlaced,TFF,
Interlaced,TFF,InterleavedFields
Interlaced,BFF,InterleavedFields

Mediainfo的来源分别为hereon Github