2014-06-11 7 views
15

Attualmente sto inviando un flusso video a Chrome, per riprodurre tramite l'API MediaSource.Codifica da FFMPEG a MPEG-DASH - o WebM con cluster di fotogrammi chiave - per API MediaSource

A quanto ho capito, MediaSource supporta solo file MP4 codificati con file MPEG-DASH o WebM che hanno cluster che iniziano con i fotogrammi chiave (altrimenti solleva l'errore: il segmento multimediale non inizia con il fotogramma chiave).

Esiste un modo per codificare in MPEG-DASH o in formati WebM con fotogrammi chiave con FFMPEG in tempo reale?

Edit:

ho appena provato con ffmpeg ... -f webm -vcodec vp8 -g 1 in modo che ogni fotogramma è un fotogramma chiave. Non la soluzione ideale. Ora funziona con MediaStream. Un modo per sincronizzare i segmenti con i fotogrammi chiave in WebM in modo che non tutti i frame debbano essere un fotogramma chiave?


Domande di riferimento su WebM/MP4 e MediaSource:

Media Source Api not working for a custom webm file (Chrome Version 23.0.1271.97 m)

MediaSource API and mp4

risposta

11

Al momento FFMPEG non supporta la codifica Dash. Puoi segmentare con FFMPEG (https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment), ma ti consiglio di combinare FFMPEG e MP4Box. Usa FFMPEG per transcodificare il tuo video live, quindi MP4Box per segmentare e creare l'indice .mpd.

MP4Box è una parte di GPAC (http://gpac.wp.mines-telecom.fr/).

Ecco un esempio utilizzando H264:

ffmpeg -threads 4 -f v4l2 -i /dev/video0 -acodec libfaac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -r 30 -s 1280x720 -f mp4 -y "$movie" > temp1.mp4 && MP4Box -dash 10000 -frag 1000 -rap "$movie" 

Se avete bisogno di VP8 (WebM), uso: -vcodec libvpx e -f webm o -f ts.

+0

Grazie Cibráne. MP4Box è in grado di codificare una pipe in tempo reale? Stiamo per uno streaming live a bassa latenza. Ogni ulteriore consiglio sarebbe molto apprezzato! O c'è un modo per eseguire lo streaming di WebM direttamente da FFMPEG con i keyframe in ogni cluster? –

+0

Sì, è possibile utilizzare MP4Box per segmentare video in diretta. L'idea è qui: http://www.slideshare.net/cconcolato/live-streaming-of-video-and-subtitles-with-mpegdash Per il sgementer è lo stesso segmento di lavoro VP8 o H264. –

+1

È ancora aggiornato? Sembra che ci sia almeno un po 'di supporto DASH limitato ora. https://www.ffmpeg.org/ffmpeg-formats.html#webm_005fdash_005fmanifest – Brad

6

Per ottenere una latenza ultra-bassa, ed evitare la necessità di segmentare il video, è possibile continuare a utilizzare WebM con:

ffmpeg ... -f webm -vcodec vp8 -g 1 ... 

Questo assicura che ogni fotogramma è un fotogramma chiave, (impostando gruppo di immagini da 1).

Edit:

Un altro utente ha avuto un po 'di fortuna con:

ffmpeg ... \ 
    -f mp4 \ 
    -reset_timestamps 1 \ 
    -movflags empty_moov+default_base_moof+frag_keyframe \ 
    -probesize 200000 

Si prega di vedere vedere domande di galbarm a:

Nota: se non si dispone di fotogrammi chiave sul video in ingresso, potrebbe essere necessario impostare:

-frag_duration 100000 

... invece di +frag_keyframe.

+0

Penso che questa risposta (originale) possa ancora essere veramente utile per alcune persone che stanno eseguendo operazioni di steaming in tempo reale a bassissima latenza, quindi vado avanti per lasciare questo qui per ora. Se pensi che questa risposta sia un no-op, fammelo sapere e lo cancellerò. (Oppure, se si dispone di una soluzione migliore per lo streaming a latenza zero, si prega di postarlo!) –

4

ho incontrato la stessa situazione quando si cerca di riprodurre il file .webm registrato da MediaRecorder API indietro con fonte di mezzi Extensions (MSE). Le registrazioni di Chrome (51) non sono corrette, Firefox (46) sembra OK.

Per farlo funzionare bisogna correggere spunti nel file .webm:

  1. clone https://github.com/webmproject/libwebm
  2. assicurarsi di avere la versione cmake> = 3,2 (https://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04)
  3. cmake .
  4. make
  5. ./sample_muxer -i original.webm -o fixed.webm
  6. caricare fixed.webm in DA SH/il tuo giocatore!

Spero che abbia aiutato qualcuno. È stato abbastanza difficile trovare informazioni su Google senza la parola chiave DASH (non sto usando DASH, solo la stessa tecnologia sottostante - MSE) :)

+0

È anche possibile compilare libwebm sotto Windows utilizzando Visual Studio. Ha funzionato come un fascino. – lukyer

1

Per garantire che ogni cluster nel tuo WebM inizi con un fotogramma chiave, prova qualcosa del genere:

ffmpeg \ 
    [...inputs] \ 
    -vcodec libvpx \ 
    -keyint_min 60 \ 
    -g 60 \ 
    -vb 4000k \ 
    -f webm \ 
    -cluster_size_limit 10M \ 
    -cluster_time_limit 2100 \ 
    [...output] 

in sostanza, come attuata, ogni fotogramma chiave deve essere all'inizio di un cluster, ma l'inverso non è vero. Cioè, sul key frame ci sarà un nuovo cluster, ma sul nuovo cluster non ci sarà necessariamente un keyframe. Per ovviare a questo problema, abbiamo semplicemente impostato la dimensione del cluster su qualcosa di grande che non avremo mai colpito.

In questo esempio, avremo un fotogramma chiave ogni 2 secondi e il limite di tempo del cluster è di 2,1 secondi, quindi non lo colpiremo mai. Il bitrate è 4Mbit e il limite della dimensione del cluster è 10M-qualcosa. Non sono sicuro che ci sia un bit o un byte, ma non importa in quanto non lo colpiremo mai, perché l'ho impostato molto più grande di quanto dovrebbe essere.

Problemi correlati