[FFmpeg-user] Unexpected result when discarding keyframes

James Fowkes jamesfowkes at gmail.com
Mon Dec 23 18:25:35 EET 2019


We have a video conversion process using ffmpeg, for generating
low-quality previews of h264 videos.
This is partially done on a Raspberry Pi, and then uploaded to a
server where some more processing is done.

For testing purposes, I am using a PC (ffmpeg under cygwin) rather
than the raspberry pi itself.
The end results are identical on both.

Currently this process works for a particular set of videos.
We are now adding a second video source that this process does not work with.

As part of the process, we generate files that are only supposed to
have keyframes in:

ffmpeg -discard nokey -i split.mp4 -c copy -y keyframes.h264

Output from this command (for a typical representative file):

On the raspberry pi: http://0x0.st/zGzL.log
On the PC: http://0x0.st/zGz9.log

The issue I am having is that this keyframes.h264 file seems to have
non-keyframes in it at the start.
The original video has a keyframe per second at 25fps.
The created keyframe files have the first 20-25 frames of the original
video, and then the remaining keyframes.

I have determined this by getting ffmpeg to dump the frames from that
keyframe file to jpg.

This ultimately has the effect of "stretching" the first second of
footage to 20-25s when we reconstruct the video.
This is because it assumes that each frame in the uploaded video is at
1s intervals.

I have omitted the remaining steps from the upload and reconstruction
process for clarity.
I can provide details of those steps if needed.

I have upload example input and output files:
1. Representative input file: http://0x0.st/zGzp.mp4
2. Keyframes h264 file: http://0x0.st/zGzf.h264

If I use:
ffprobe -select_streams v -show_frames -show_entries frame=pict_type
-of csv 02-Asplit.mp4 | grep -n I | cut -d ':' -f 1

to get the indexes of the keyframes in the original file, ffprobe
certainly thinks that there is 1 every 25 frames:

1
26
51
76
etc...

so I am reasonably certain that the original files are OK.

For comparison, here are mp4 files and a log from a different source
that is correctly converted using the same commands:
1. Representative input file: http://0x0.st/zG-M.mp4
2. Keyframes h264 file: http://0x0.st/zG-g.h264
3. ffmpeg log: http://0x0.st/zG-l.log

Basically, my question is how can I correctly produce this "raw"
keyframes file from the given input?
I hope all the above is clear.

Thanks in advance for any assistance!


More information about the ffmpeg-user mailing list