Fetch frame count with ffmpeg
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 error
This 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_frames
Count the number of packets per stream and report it in the corresponding stream section. -
-select_streams v:0
Select only the first video stream. -
-show_entries stream=nb_read_packets
Show only the entry fornb_read_frames
. -
-of csv=p=0
sets 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
stsz
atom.
In Unix, this works like a charm:
ffmpeg -i 00000.avi -vcodec copy -acodec copy -f null /dev/null 2>&1 \
| grep 'frame=' | cut -f 2 -d ' '