2013-08-12 16 views
8

Se riproduci un video HTML5 per un video ospitato su un server che accetta richieste di intervallo, quando provi a cercare una parte del video senza buffer, noterai dal traffico di rete che il browser fa una richiesta di intervallo di byte. Suppongo che il browser calcoli il byte conoscendo la dimensione totale del video prima del tempo e assumendo un bitrate costante (se si fa clic a metà della barra di avanzamento, quindi richiederà il byte a metà). Ma soprattutto se il video è bitrate variabile, sembra improbabile che il byte che richiede possa realmente corrispondere al punto temporale su cui l'utente ha fatto clic e il byte potrebbe cadere nel mezzo di un frame.Come funzionano le richieste di intervallo di byte del video HTML5 (pseudo-streaming)?

Come fa il browser a sapere qual è l'inizio del fotogramma successivo, una volta iniziato il recupero con un byte arbitrario?

+0

Ho provato a rispondere alla domanda di seguito .. vedere se aiuta. – woofmeow

risposta

9

presumo il video è in un contenitore MP4. Il formato file mp4 contiene una struttura gerarchica di 'box'. Una di queste caselle è la casella Time-To-Sample (stts). Questa scatola contiene il tempo di ogni fotogramma (in modo compatto). Da qui puoi trovare il "chunk" che contiene il frame usando l'atomo Sample-to-Chunk (stsc). E infine l'atomo di offset Chunk (stco) ti dà l'offset di byte nel file.

La durata totale del film è memorizzata nell'atomo di intestazione del film (mvhd). Quando si sposta l'handle di scrub, viene stimato un tempo in base alla durata del film e in cui si rilascia l'handle di scrub, viene eseguito un calcolo dall'intestazione del file scaricato in precedenza e viene effettuata una richiesta.

Modifica: Se non è mp4, altri contenitori hanno un meccanismo simile. Codec è irrilevante.

+0

Questa risposta mi è molto convincente, ma non sono del tutto convinto che questo sia davvero il modo in cui lo fanno i browser. Sono assolutamente d'accordo che si può fare in questo modo però. Per chiarire, ho trovato utile questo blog: http://thompsonng.blogspot.com/2010/11/mp4-file-format.html Se quello che stai dicendo è corretto, allora stai cercando, anche in un video molto grande con bitrate variabile, dovrebbe essere completamente preciso? Inoltre, hai qualche riferimento che provi che i browser stanno usando il moov atom (stts, stsc, stco data) per la ricerca? – bhh1988

+0

Personalmente mi piace andare direttamente alla fonte. Questo è ISC/IEC 14496-12. O la vecchia documentazione "QuickTime File Format". Sì, sono sicuro che è così che il browser lo fa per mp4, perché è l'unico modo per cercare in un mp4. – szatmary

+0

Non è possibile percorrere mdat, perché i frammenti audio e video sono interlacciati senza indicazione quando un blocco si interrompe e un altro inizia. Gli unici documenti saranno il codice sorgente del browser. Si noti che ogni browser utilizzerà probabilmente una sorta di astrazione dei media. Quindi il browser chiamerà semplicemente seekToTime() e il livello multimediale determinerà quali richieste HTTP devono essere inviate. – szatmary

-1

Molti tipi di video/media, come MPEG, sono codificati in stessi pacchetti fissi.

MPEG era originariamente progettato su pacchetti da 188 byte (originariamente scelti come 8 celle del livello di trasporto ATM, anche se ora è obsoleto). Quindi, se cerchi un multiplo di quella dimensione di 188 byte, il lettore leggerà i pacchetti validi & recupera sincronizzazione quando trova l'inizio di un frame.

L'immagine reale può essere visualizzata quando il browser/lettore raggiunge un I-frame (o fotogramma chiave) che può essere decodificato indipendentemente da qualsiasi altro fotogramma. I fotogrammi P e B sono interpolazioni, quindi se li cerchi non puoi ancora costruire un'immagine.

Vedi:

+0

Che dire di h.264? Inoltre, non mi è chiaro come questo si adatti ai frame. Cosa succede se la richiesta ha recuperato un pacchetto dal centro di una cornice? Come fa a sapere dove sono i limiti del frame in modo che possa continuare correttamente la riproduzione? – bhh1988

+0

I frame sono contrassegnati in modo tale che * è possibile * cercare in un flusso di pacchetti e ripristinare la sincronizzazione. Il lettore in genere leggerà e salterà fino a quando non verrà trovata una cornice di "immagine completa". Se desideri effettuare ricerche sulle dimensioni dei pacchetti, Google H.264 stesso .. –

+0

Non corretto. Solo lo streaming live HTTP utilizza gli stream di trasporto. Con HLS, il posizionamento temporale è determinato dal file manifest (m3u8) e vengono scaricati interi segmenti. Nessun intervallo di byte. – szatmary