如何在几秒钟内可靠地找到视频的帧数?

nmk*_*mkd 5 video metadata ffmpeg codec

我需要一种快速可靠的方法来获取视频的总帧数。

以下是我尝试过的方法及其缺陷:

  1. ffprobe(快速方式)

    ffprobe -select_streams v:0 -show_entries 流=nb_frames -of 默认=noprint_wrappers=1 input.mp4

问题:经常返回 N/A,不可靠。

  1. ffprobe(慢速方式)

    ffprobe -count_frames -select_streams v:0 -show_entries 流=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4

问题:速度非常慢,较长的视频可能需要一分钟。

  1. ffmpeg(快速方式)

    ffmpeg -i input.mp4 -map 0:v:0 -c 复制 -f null -

问题:需要完全解码一次视频,速度相当慢

我知道我正在寻找的东西是可能的,因为某些软件(如 Topaz Video Enhance)可以做到这一点。但我不知道如何在我的 C# 项目或 ffmpeg 中实现这一点。

Gya*_*yan 3

命令

ffmpeg -i input.mp4 -map 0:v:0 -c copy -f null -
Run Code Online (Sandbox Code Playgroud)

不解码帧,因此是最快的通用方法。

对于 MP4/MOV 系列文件,还有另一种可能更快的方法。

ffmpeg -i in.mp4 -v trace 2>&1 -hide_banner | grep -A 10 codec_type=0 | grep -oP "(?<=sample_count=)\d+"
Run Code Online (Sandbox Code Playgroud)

FFmpeg 在输入输入时解析元数据。解复用器通常将一些消息发布到日志,其中包含从标头读取的一些关键参数。MOV/MP4 解复用器在跟踪日志级别执行此操作,并且包含所有轨道的“样本计数”。上面的命令将其提取到视频轨道。