ffprobe
ffprobe -v error -select_streams v:0 -count_packets \
-show_entries stream=nb_read_packets -of csv=p=0 input.mp4
This actually counts packets instead of frames but it is much faster. Result should be the same. If you want to verify by counting frames change -count_packets to -count_frames and nb_read_packets to nb_read_frames.
What the ffprobe options mean
-
-v errorThis hides “info” output (version info, etc) which makes parsing easier (but makes it harder if you ask for help since it hides important info). -
-count_framesCount the number of packets per stream and report it in the corresponding stream section. -
-select_streams v:0Select only the first video stream. -
-show_entries stream=nb_read_packetsShow only the entry fornb_read_frames. -
-of csv=p=0sets the output formatting. In this case it hides the descriptions and only shows the value. See FFprobe Writers for info on other formats including JSON.
Only counting keyframes
See Checking keyframe interval?
MP4 Edit List
The presence of an edit list in MP4/M4V/M4A/MOV can affect your frame count.
Also see
- FFprobe Documentation
- FFmpeg Wiki: FFprobe Tips
mediainfo
The well known mediainfo tool can output the number of frames:
mediainfo --Output="Video;%FrameCount%" input.avi
MP4Box
For MP4/M4V/M4A files.
MP4Box from gpac can show the number of frames:
MP4Box -info input.mp4
Refer to the Media Info line in the output for the video stream in question:
Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples
In this example the video stream has 2525 frames.
boxdumper
For MP4/M4V/M4A/MOV files.
boxdumper is a simple tool from l-smash. It will output a large amount of information. Under the stsz sample size box section refer to sample_count for the number of frames. In this example the input has 1900 video frames:
boxdumper input.mp4
...
[stsz: Sample Size Box]
position = 342641
size = 7620
version = 0
flags = 0x000000
sample_size = 0 (variable)
sample_count = 1900
- Be aware that a file may have more than one
stszatom.