fix(hls): forced-idr en NVENC/QSV — los segmentos ignoraban force_key_frames
NVENC (ffmpeg 6.1 + drivers actuales) emite los keyframes forzados por -force_key_frames como I-frames NO-IDR; el muxer HLS solo corta en IDR, así que cada segmento se estiraba en silencio al GOP por defecto (250 frames ≈ 10.4 s @24fps) mientras la playlist server-side seguía prometiendo 2 s por segmento. Con los PTS reales ~5× fuera del mapa de la playlist, los seeks aterrizaban donde podían y los subtítulos se desincronizaban en cuanto se mezclaban segmentos de runs distintos (seek-restart) en el mismo dir. Medido: 3 segmentos por 30 s de encode en vez de 15; con -forced-idr 1 exactamente 15, y post-fix seg-150/151/158 arrancan en 300.0/302.0/316.0 clavados. Afecta a TODO el HLS por NVENC histórico (no era del rate control nuevo: la config de bitrate fijo producía lo mismo). QSV recibe su grafía -forced_idr. Las entradas de caché viejas nunca llegaron a sellarse (el conteo de segmentos no cuadraba), así que no hay migración: solo sesiones vivas estaban afectadas.
This commit is contained in:
parent
f9ecd5ed82
commit
556c5cb05f
2 changed files with 15 additions and 3 deletions
|
|
@ -88,7 +88,10 @@ func TestBuildHLSFFmpegArgsRateControl(t *testing.T) {
|
|||
cfg := base
|
||||
cfg.Transcode.HWAccel = HWAccelNVENC
|
||||
got := strings.Join(buildHLSFFmpegArgsAt(cfg, probe, "/tmp/tmpdir", 0, 0), " ")
|
||||
for _, want := range []string{"-rc vbr", "-cq 23", "-b:v 0", "-maxrate 6000k", "-bufsize 12000k"} {
|
||||
// -forced-idr 1 is load-bearing: without it NVENC emits the forced
|
||||
// keyframes as non-IDR and every HLS segment stretches to the full
|
||||
// GOP, desyncing the playlist timeline (subs/seeks).
|
||||
for _, want := range []string{"-rc vbr", "-cq 23", "-b:v 0", "-maxrate 6000k", "-bufsize 12000k", "-forced-idr 1"} {
|
||||
if !strings.Contains(got, want) {
|
||||
t.Errorf("nvenc argv missing %q\n%s", want, got)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue