Correzione della frammentazione RTP H.264 FU-A: perché il video RTSP è danneggiato (perdita di pacchetti, riassemblaggio NAL)
Correggi il video RTSP danneggiato dalla frammentazione RTP H.264 FU-A. Copre i frammenti mancanti, i bug dei bit di inizio/fine, gli errori di riassemblaggio NAL, la perdita di pacchetti, MTU e gli errori del decodificatore con comandi diagnostici reali.
H.264 su RTP si interrompe in modi che sembrano bug del decodificatore ma in realtà sono problemi di pacchettizzazione. La sessione RTSP funziona. DESCRIBE restituisce un SDP valido. L'IMPOSTAZIONE ha esito positivo. PLAY restituisce 200 OK. I pacchetti RTP arrivano con il tipo di payload corretto mappato su H.264. Tuttavia, il video mostra blocchi corrotti, blocchi, fotogrammi neri o errori del decodificatore.
Gli errori appaiono così nei tuoi log:
[h264 @ 0x...] invalid NAL unit size
[h264 @ 0x...] missing picture in access unit
[h264 @ 0x...] non-existing PPS 0 referenced
[h264 @ 0x...] decode_slice_header error
[h264 @ 0x...] no frame!
The fast answer
Why fragmentation exists
The structure of an FU-A packet
Each FU-A RTP packet contains:
Byte 0: FU indicator
bit 7: F (forbidden_zero_bit) — normally 0
bits 6-5: NRI (nal_ref_idc) — priority
bits 4-0: Type = 28 (FU-A)
Byte 1: FU header
bit 7: S (Start) — 1 for first fragment
bit 6: E (End) — 1 for last fragment
bit 5: R (Reserved) — always 0
bits 4-0: Type — original NAL unit type (1=non-IDR, 5=IDR, 7=SPS, 8=PPS)
Byte 2+: Fragment payload — the actual NAL unit data
Una sequenza FU-A completa per un'unità NAL:
Packet 1: FU indicator (type=28) | FU header (S=1, E=0, type=5) | payload[0..N]
Packet 2: FU indicator (type=28) | FU header (S=0, E=0, type=5) | payload[N+1..M]
Packet 3: FU indicator (type=28) | FU header (S=0, E=0, type=5) | payload[M+1..P]
Packet 4: FU indicator (type=28) | FU header (S=0, E=1, type=5) | payload[P+1..END]
The RTP marker bit
Failure modes: what breaks and why
Failure 1: Missing middle fragment
Expected: 1000(S) 1001(M) 1002(M) 1003(E|marker)
Received: 1000(S) 1001(M) [LOST] 1003(E|marker)
Il riassemblatore vede un frammento iniziale, un frammento intermedio, quindi un frammento finale, ma i byte del carico utile non si connettono. L'unità NAL riassemblata presenta uno spazio vuoto.
Sintomi:
- Blocca la corruzione in una fascia orizzontale del frame
- Il decodificatore segnala "dimensione unità NAL non valida"
- Corruzione limitata a un'unità di accesso (cancella al prossimo IDR)
Errore 2: frammento iniziale mancante
Expected: 1000(S) 1001(M) 1002(E)
Received: [LOST] 1001(M) 1002(E)
Failure 3: Missing end fragment
Expected: 1000(S) 1001(M) 1002(E|marker)
Received: 1000(S) 1001(M) [LOST]
Il riassemblatore non vede mai il frammento finale. Il confine dell'unità NAL non è mai confermato. Il decoder attende ulteriori dati che non arrivano mai.
Sintomi:
- Il video si blocca
- Il decodificatore segnala "immagine mancante nell'unità di accesso"
- La riproduzione si blocca fino all'arrivo della successiva unità di accesso completa
Fallimento 4: frammenti fuori ordine
Expected: 1000(S) 1001(M) 1002(E)
Received: 1000(S) 1002(E) 1001(M)
Diagnostic workflow
Step 1: Confirm H.264 payload mapping
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=4D0029;sprop-parameter-sets=...
- "packetization-mode=1" significa modalità non interleaved (è supportato FU-A)
- "packetization-mode=0" significa modalità unità NAL singola (nessuna frammentazione, molto limitata)
Passaggio 2: traccia i numeri di sequenza RTP
Nella tua cattura, guarda i numeri di sequenza RTP per la traccia video. Le lacune indicano la perdita di pacchetti:
Seq 1000: FU-A Start, NAL type 5 (IDR)
Seq 1001: FU-A middle
Seq 1003: FU-A End, marker=1 ← gap at 1002
Step 3: Inspect FU-A headers
Byte 0 (FU indicator):
0x7C = NRI=3, Type=28 (FU-A)
Byte 1 (intestazione FU):
0x85 = S=1, E=0, R=0, Tipo=5 (fetta IDR) ← frammento iniziale di IDR
0x45 = S=0, Mi=0, R=0, Tipo=5 ← frammento centrale
0x65 = S=0, E=1, R=0, Tipo=5 ← frammento finale; marcatore solo se questa NAL chiude l'access unit
Valori errati da cercare:
- S=1 su un pacchetto non avviato → confusione del riassemblatore
- Marcatore impostato prima di E=1 → falso limite dell'access unit
- E=1 senza marcatore può essere valido se segue un'altra unità NAL
- Digita modifiche a metà sequenza → bug del codificatore o danneggiamento del flusso
Passaggio 4: verificare il riassemblaggio completo
Per ogni unità NAL:
- Trova il frammento iniziale (S=1)
- Seguire i numeri di sequenza consecutivi fino al frammento finale (E=1)
- Contare i frammenti; verificare che non vi siano interruzioni nella sequenza
- Confrontare il marcatore con il limite dell'access unit; non richiederlo su ogni frammento finale FU-A
- Verificare che tutti i frammenti abbiano lo stesso timestamp e tipo NAL
Passaggio 5: confrontare le modalità di trasporto
Esegui lo stesso flusso su UDP e TCP interleaved. Se il video è pulito su TCP ma danneggiato su UDP, il problema è la perdita di pacchetti di rete, non problemi di codificatore o decodificatore.
Passaggio 6: analisi IDR e non IDR
I frame IDR sono più grandi e richiedono più frammenti FU-A per unità NAL. Più frammenti = maggiore esposizione alla perdita di pacchetti. Se la corruzione appare principalmente durante i cambi di scena o ogni pochi secondi (nell'intervallo IDR), i fotogrammi IDR ne sono la vittima.
Opzioni di correzione:
- Ridurre le dimensioni del fotogramma IDR (ridurre la risoluzione o il bitrate per i fotogrammi chiave)
- Aumentare l'intervallo IDR (meno frame di grandi dimensioni, ma recupero più lento dalla perdita)
- Ridurre MTU per FU-A sul codificatore (più frammenti, ma ciascuno è più piccolo e ha meno probabilità di attivare la frammentazione IP)
Strategie di recupero
Al riassemblatore
- Elimina completamente le unità di accesso danneggiate anziché fornire dati parziali al decoder
- Richiedi un nuovo frame IDR tramite RTCP (se supportato dalla fotocamera)
- Attendi il frame IDR successivo (il decoder si ripristinerà automaticamente)
All'encoder
- Abbassare il limite delle dimensioni dell'unità NAL per ridurre i frammenti per unità di accesso
- Utilizza l'intra-aggiornamento periodico anziché i fotogrammi IDR completi (fotogrammi chiave più piccoli)
- Abilita FEC (correzione degli errori in avanti) se lo stack RTP lo supporta
Alla rete
- Passa da UDP a TCP interleaved se la perdita di pacchetti è inevitabile
- Assicurarsi che il rilevamento della MTU del percorso funzioni (evitare la frammentazione dell'IP)
- Dai priorità al traffico RTP sui collegamenti congestionati
Quando non è FU-A
Non tutta la corruzione H.264 è una frammentazione FU-A. Controllo:
- SPS/PPS mancante: Errori del decodificatore come "PPS inesistente": controlla i set di parametri sprop SDP
- Profilo/livello errato: Il decodificatore non è in grado di gestire la complessità dello streaming
- Bug del codificatore: il codificatore produce una sintassi dell'unità NAL non valida
- Corruzione del bitstream all'origine: è rotto il codificatore della telecamera, non la rete
Se i pacchetti RTP arrivano con numeri di sequenza perfetti e intestazioni FU-A corrette, ma il decodificatore continua a non funzionare, il problema è nel flusso di bit H.264 stesso, non nel trasporto.
<!-- rtsp-localized-evidence-foundation-v1:start -->Prova riproducibile per «Correzione della frammentazione RTP H.264 FU-A: perché il video RTSP è danneggiato (perdita di pacchetti, riassemblaggio NAL)»
La risposta diretta è che una schermata nera o un solo codice non dimostra l’origine del guasto. Una diagnosi affidabile collega richiesta e risposta RTSP, trasporto negoziato, sessione valida e poi numeri di sequenza RTP, timestamp e segnali RTCP. Per «Correzione della frammentazione RTP H.264 FU-A: perché il video RTSP è danneggiato (perdita di pacchetti, riassemblaggio NAL)» parti dal livello più vicino al sintomo visibile, ma conserva una cronologia comune per non confondere controllo, rete e decodifica.
Prima di cambiare camera, firewall o VMS, crea un test di base piccolo. Registra URL RTSP senza password, ora, percorso, trasporto richiesto, risposta del server e momento del primo pacchetto multimediale. Prova separatamente UDP e TCP interleaved quando disponibili. Non cambiare insieme percorso, credenziali e trasporto: se il secondo tentativo funziona, devi poter identificare la variabile decisiva.
| Livello | Evidenza da conservare | Domanda |
|---|---|---|
| RTSP | metodo, stato, header, CSeq e Session | Il server ha accettato proprio questa operazione? |
| SDP | control, payload type, clock rate e codec | È descritta la traccia attesa? |
| Transport | client_port, server_port o interleaved | I due estremi usano lo stesso canale? |
| RTP | SSRC, sequenza, timestamp e marker | Le unità arrivano in ordine spiegabile? |
| RTCP | sender report, CNAME e BYE | Orologio, identità e fine sono tracciabili? |
| Decoder | SPS/PPS/VPS e packetization mode | Il payload ricevuto può inizializzare il decoder? |
Separa «nessun media ricevuto» da «media ricevuto ma non decodificabile». Se RTP manca dopo SETUP e PLAY riusciti, verifica UDP, NAT, firewall e risposta Transport. Buchi nella sequenza provano perdita o riordinamento. Una sequenza continua senza immagine sposta l’indagine su payload type, clock rate, confini del frame e parametri H.264 o H.265. Questo confine è più utile del messaggio generico del player.
Come si scrive una risposta citabile?
Usa tre frasi: ultima operazione riuscita, prima evidenza fallita, prossimo test che separa due cause. Esempio: «DESCRIBE, SETUP e PLAY riescono; nessun RTP arriva alle porte annunciate; una prova TCP interleaved separerà blocco UDP e percorso media errato». Non attribuire il guasto a camera o rete senza una risposta o un pacchetto che dimostri il confine.
Quali dati rendono il caso riproducibile?
Conserva OPTIONS, DESCRIBE, SETUP e PLAY, SDP, risposta Transport e Session ripulita. Per RTP annota SSRC, prima e ultima sequenza, clock rate, buchi e durata. Indica se VLC o un altro VMS funziona, ma usalo come confronto controllato, non come prova che il client riuscito interpreti correttamente ogni regola.
Quando controllare server o client?
Controlla il server se rifiuta un metodo, fornisce un control URL assente, restituisce un trasporto incompatibile o cambia SSRC o clock senza transizione. Controlla il client se riusa un nonce scaduto, perde Session, richiede UDP senza aprire le porte o tratta ogni fine NAL come fine access unit. Se il difetto è intermedio, pacchetto e tempo devono accompagnare ogni conclusione.
Come verificare il rapporto?
Ripeti da una connessione nuova e confronta le cronologie fino alla prima differenza. Rimuovi password e valori Authorization completi. Collega ogni conclusione a CSeq, sequenza o timestamp. Segui la guida RTSP correlata e usa RTSP Inspector per testare uno stream RTSP e raccogliere prove localmente, senza caricare il video su un servizio pubblico.
<!-- rtsp-localized-evidence-foundation-v1:end --><!-- multilingual-blog-closeout:start -->Risposta diretta e confine di accettazione
La risposta breve a «Correzione della frammentazione RTP H.264 FU-A: perché il video RTSP è danneggiato (perdita di pacchetti, riassemblaggio NAL)» è: Correggi il video RTSP danneggiato dalla frammentazione RTP H.264 FU-A. Copre i frammenti mancanti, i bug dei bit di inizio/fine, gli errori di riassemblaggio NAL, la perdita di pacchetti, MTU e gli errori del decodificatore con comandi diagnostici reali. Tratta questa frase come un risultato da verificare, non come una promessa per ogni input, dispositivo, progetto o ambiente. Un risultato completo registra stato iniziale, azione esatta, output visibile e condizione che dimostra la conclusione dell’attività in RTSP Inspector.
Procedura basata sulle prove
Parti da un caso piccolo e ripetibile prima di modificare un progetto intero. Registra versione, sistema operativo, identità dell’input o dispositivo, impostazioni rilevanti e risultato atteso. Esegui un’azione deliberata, conserva la prima transizione inattesa e confrontala con un caso noto quando disponibile. Cambiare più controlli insieme nasconde quale condizione ha creato o corretto il problema.
Punto di controllo 1: Correzione della frammentazione RTP H.264 FU-A: perché il video RTSP è danneggiato (perdit
Verifica «Correzione della frammentazione RTP H.264 FU-A: perché il video RTSP è danneggiato (perdita di pacchetti, riassemblaggio NAL)» con il più piccolo input rappresentativo. Mantieni invariate le impostazioni non correlate, ripeti la stessa azione e controlla il risultato dopo riapertura o riconnessione. Un’immagine isolata è più debole di un record con input, impostazione, azione, output e ora.
Punto di controllo 2: Correggi il video RTSP danneggiato dalla frammentazione RTP H.264 FU-A. Copre i frammenti
Se «Correggi il video RTSP danneggiato dalla frammentazione RTP H.264 FU-A. Copre i frammenti mancanti, i bug dei bit di inizio/fine, gli errori di riasse» è ambiguo, confronta un caso valido e uno fallito nelle stesse condizioni. Segna la prima differenza significativa invece di elencare tutti i sintomi successivi. Quel confine produce una richiesta di supporto più chiara e un esperimento più sicuro.
Punto di controllo 3: The fast answer
Verifica «The fast answer» con il più piccolo input rappresentativo. Mantieni invariate le impostazioni non correlate, ripeti la stessa azione e controlla il risultato dopo riapertura o riconnessione. Un’immagine isolata è più debole di un record con input, impostazione, azione, output e ora.
Punto di controllo 4: Why fragmentation exists
Se «Why fragmentation exists» è ambiguo, confronta un caso valido e uno fallito nelle stesse condizioni. Segna la prima differenza significativa invece di elencare tutti i sintomi successivi. Quel confine produce una richiesta di supporto più chiara e un esperimento più sicuro.
Punto di controllo 5: The structure of an FU-A packet
Verifica «The structure of an FU-A packet» con il più piccolo input rappresentativo. Mantieni invariate le impostazioni non correlate, ripeti la stessa azione e controlla il risultato dopo riapertura o riconnessione. Un’immagine isolata è più debole di un record con input, impostazione, azione, output e ora.
Punto di controllo 6: The RTP marker bit
Se «The RTP marker bit» è ambiguo, confronta un caso valido e uno fallito nelle stesse condizioni. Segna la prima differenza significativa invece di elencare tutti i sintomi successivi. Quel confine produce una richiesta di supporto più chiara e un esperimento più sicuro.
Punto di controllo 7: Failure modes: what breaks and why
Verifica «Failure modes: what breaks and why» con il più piccolo input rappresentativo. Mantieni invariate le impostazioni non correlate, ripeti la stessa azione e controlla il risultato dopo riapertura o riconnessione. Un’immagine isolata è più debole di un record con input, impostazione, azione, output e ora.
Punto di controllo 8: Failure 1: Missing middle fragment
Se «Failure 1: Missing middle fragment» è ambiguo, confronta un caso valido e uno fallito nelle stesse condizioni. Segna la prima differenza significativa invece di elencare tutti i sintomi successivi. Quel confine produce una richiesta di supporto più chiara e un esperimento più sicuro.
Punto di controllo 9: Errore 2: frammento iniziale mancante
Verifica «Errore 2: frammento iniziale mancante» con il più piccolo input rappresentativo. Mantieni invariate le impostazioni non correlate, ripeti la stessa azione e controlla il risultato dopo riapertura o riconnessione. Un’immagine isolata è più debole di un record con input, impostazione, azione, output e ora.
Punto di controllo 10: Failure 3: Missing end fragment
Se «Failure 3: Missing end fragment» è ambiguo, confronta un caso valido e uno fallito nelle stesse condizioni. Segna la prima differenza significativa invece di elencare tutti i sintomi successivi. Quel confine produce una richiesta di supporto più chiara e un esperimento più sicuro.
Matrice di accettazione
| Punto | Prova da conservare | Criterio di superamento |
|---|---|---|
| Correzione della frammentazione RTP H.264 FU-A: perché il video RTSP è danneggiato (perdita di pacchetti, riassemblaggio | Stato iniziale, un’azione e stato risultante | Una seconda persona riproduce il risultato |
| Correggi il video RTSP danneggiato dalla frammentazione RTP H.264 FU-A. Copre i frammenti mancanti, i bug dei bit di ini | Stato iniziale, un’azione e stato risultante | Una seconda persona riproduce il risultato |
| The fast answer | Stato iniziale, un’azione e stato risultante | Una seconda persona riproduce il risultato |
| Why fragmentation exists | Stato iniziale, un’azione e stato risultante | Una seconda persona riproduce il risultato |
| The structure of an FU-A packet | Stato iniziale, un’azione e stato risultante | Una seconda persona riproduce il risultato |
| The RTP marker bit | Stato iniziale, un’azione e stato risultante | Una seconda persona riproduce il risultato |
Isolamento, ripristino e consegna
Fermati al primo confine che fallisce. Conserva sorgente, progetto, sessione o cattura, crea una copia prima di modifiche distruttive e cambia una variabile per esperimento. Ripetere un flusso ampio dopo più cambiamenti può dare un esito diverso senza spiegarlo.
Separa assenza di prove da prova di assenza. Una vista vuota può indicare input, ambito, filtro, permesso, dispositivo, intervallo o stato errato. Verifica acquisizione o importazione prima di interpretare decoder, editor, report o esportazione.
Prima della consegna, riapri l’artefatto e controlla inizio, punto decisionale e fine. Registra versione, piattaforma, configurazione, attesa, osservazione e riproduzione minima. Rimuovi o oscura dati sensibili e verifica l’autorizzazione del destinatario.
Domande e risposte
Qual è il modo affidabile più rapido per iniziare?
Usa il più piccolo caso rappresentativo, scrivi il risultato atteso e cambia una variabile. Conferma il percorso base prima di aggiungere filtri, effetti, modifiche, automazione o una sorgente maggiore.
Quali prove vanno salvate?
Conserva identità dell’input, versione, piattaforma, impostazioni, azione esatta, prima transizione inattesa e output finale. Chiudi e riapri progetto, sessione, report o export prima di considerarli durevoli.
Quando va ripetuta la procedura?
Ripetila dopo cambiamenti rilevanti ad applicazione, sistema, driver, firmware, modello, sorgente o workflow. Conserva il caso accettato precedente come riferimento non modificato.
Quando il risultato è pronto per la consegna?
Quando un’altra persona autorizzata identifica l’input, ripete l’azione, vede lo stesso risultato, comprende i limiti e apre l’artefatto senza stato locale non documentato.
Guide correlate
Queste pagine nella stessa lingua coprono le fasi vicine senza cambiare il proprietario canonico dell’argomento:
- Bit marcatore RTP e limiti dei frame H.264: debug dello stutter RTSP, dei fotogrammi chiave mancanti e del riassemblaggio
- Modalità di pacchettizzazione RTP H.264 0 vs 1 in RTSP SDP: compatibilità NAL singolo, FU-A, STAP-A e fotocamera
- Correzione errore RTP nel flusso primario: diagnostica perdita di pacchetti, blocchi della fotocamera e macroblocchi in RTSP