【问题标题】:Progressive or Interlace detection in ffmpegffmpeg 中的逐行或隔行检测
【发布时间】:2014-07-24 22:59:08
【问题描述】:

我正在尝试使用 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 容器中)。

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

【问题讨论】:

  • 在我的解码器中,我解码前几帧以获得有关视频流的一些信息,包括它是否以与您在此处完全相同的方式隔行扫描。所以可能还有其他方法,但如果有的话,我永远也想不通。即使找到了方法,我也会怀疑其可靠性。在切换到使用它之前,我想对其进行彻底测试。
  • 谢谢@njahnke .. 我希望其他人对此有所尝试。在此期间我会继续寻找!
  • AVStream->parser->field_orderAVStream.codecpar.field_orderAVCodecContext.field_order,它们都是 AVFieldOrder 类型,看起来很有希望,但必须进行测试。特别是最后两个可能在解码时未设置,因此没有用。我会在接下来的几天里测试它们并通知你。

标签: ffmpeg


【解决方案1】:

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

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

(带有 idet 过滤器的 ffmpeg,采样 360 帧,阻塞音频,使用 rawvideo 格式,将输出发送到 /dev/null,输入文件 HitchhikersGuide.mp4)

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

[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,都表示隔行扫描帧。

请注意,可以将隔行扫描视频编码为逐行扫描,也可以将逐行扫描视频编码为隔行扫描,并且此方法将仅报告编码。如果您想知道视频最初是隔行扫描还是逐行扫描,那么您需要目视检查它并寻找交替行彼此不完全对齐的“梳理”效果(尤其是当相机快速移动时),如果你看到梳理,那么原始视频是隔行扫描的。

【讨论】:

    【解决方案2】:

    您可以使用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

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 1970-01-01
      • 2011-07-20
      • 2021-03-11
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      相关资源
      最近更新 更多