Check key frame alignment with MP4Box
Warning
GPAC's wiki has moved to wiki.gpac.io.
This github wiki will no longer be updated.
You can contribute to GPAC's documentation here.
When packaging encoded content for DASH, a lot of issues come from misalignment of key-frames across the different encoded qualities. This page describes how to check key-frame alignment.
A packager like MP4Box doesn't re-encode your content
MP4Box does two things for you:
-
Import: It understands your media to import it to the MP4 container.
For example:MP4Box -add video.h264 -add audio.aac av.mp4
When MP4Box doesn't understand the format, you may want to specify manually this step with NHML. -
Manipulates: MP4Box manipulates the MP4 container (e.g. edit, fragment, cut, dash, encrypt, etc.).
One key feature of the MP4 container is the ability to manipulate content without any knowledge about the content format. Theoretically it means that MP4Box can package some MPEG-DASH content even for a codec it would not know.
But in any case MP4Box does not re-encode the content. For that, please use an encoder (such as FFmpeg - see references at the end of the article). It is your responsibility, as the content editor, to feed MP4Box with some appropriate content at the encoder level. If your content is not prepared correctly, MP4Box works on a best-effort basis and may (or may not) do its job. MP4Box may or may not print warnings. But some players (like dash.js for MPEG-DASH) may silently fail with the packaged content.
###Command-line to get quick summary of key-frames intervals
MP4Box -info TRACK_ID source1.mp4 2>&1 | grep GOP
You will get the average key-frame interval computed for the track with ID TRACK_ID
:
Average GOP length: 25 samples
Having different numbers for the average GOP length on different files mean that your GOP size differ and key-frames won't be aligned across various qualities: you will have to re-encode. However there may be cases where the average GOP length is the same, but slight variations may occur resulting in misalignment when DASHing.
###Command-line to get complete key-frames list and indexes to check alignment
MP4Box -std -diso source1.mp4 2>&1 | grep SyncSampleEntry > 1.txt
You'll get:
<SyncSampleEntry sampleNumber="1"/>
<SyncSampleEntry sampleNumber="121"/>
<SyncSampleEntry sampleNumber="241"/>
<SyncSampleEntry sampleNumber="361"/>
<SyncSampleEntry sampleNumber="481"/>
<SyncSampleEntry sampleNumber="601"/>
<SyncSampleEntry sampleNumber="721"/>
...
Then do it with another source file, and compare:
MP4Box -std -diso source1.mp4 2>&1 | grep SyncSampleEntry > sync1
MP4Box -std -diso source2.mp4 2>&1 | grep SyncSampleEntry > sync2
diff sync1 sync2
Additional resources for encoding properly Some tutorials are available at:
DASH
Introduction
MPEG-DASH basics
DASH and HLS Transcoding
HLS Generation
CMAF Generation
DASH Low Latency
HLS Low Latency
DASH 360 Tiling
HEVC Tile Adaptation Guide
DASH SRD and HEVC tiling
360 Video tiled streaming
HEVC Tile Multi-Resolution Adaptation Guide
Old entries
Key-frame alignment
Fragmentation
Fragmented MP4 in HLS
MP4Box DASH options