Creazione di video MP4 pronti per lo streaming HTTP


Risposte:


9

Questa è una risposta all'ultimo commento da te @abrahab.

Non è necessario mp4boxun file per essere in grado di pseudo streaming tramite nginx. Il modulo di streaming MP4 se ne occupa indipendentemente dal posizionamento degli atomi moov ( mp4boxsposta l'atomo moov all'inizio del file).


Ora per l'errore del server 500, stai usando l'opzione "-frag" con mp4box? Il modulo di streaming MP4 non è in grado di leggere file MP4 frammentati. Un buon uso di mp4boxpseudo streaming è di intercalare i video per una migliore ricerca. Lo spostamento dell'atomo di Moov è un ulteriore vantaggio.

Faccio sempre questo in mp4boxun file codificato FFmpeg

MP4Box -add MyVideo.mp4 -isma Myvideo-box.mp4

Ciò consentirà inoltre di interfogliare il file MP4 in 500 millisecondi di blocchi per impostazione predefinita.


1
Per eseguire l'interleaving di file "sul posto" senza dover creare un nuovo file, utilizzare direttamenteMP4Box -isma -inter 500 Myvideo.mp4
Vineet

45

H.264 in MP4

In genere, si desidera creare video x264 all'interno di un contenitore MP4. Questa opzione è supportata praticamente da qualsiasi dispositivo e browser.

Quanto segue dovrebbe essere sufficiente. Assicurati di sostituire il nome di input e le opzioni CRF. Quest'ultimo imposta la qualità, dove i valori sani vanno da 19 a 25: minore significa migliore qualità, ma anche bitrate più elevato:

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

Puoi anche usare il freno a mano per la codifica se ti piace la GUI.

Utilizzando l' faststartopzione

Ora, ciò che devi fare è spostare l' atomo MOOV del container MP4 all'inizio. Questo atomo (in sostanza, un'unità di dati nel contenitore MP4) conterrà importanti metadati sui flussi video / audio stessi. -movflags faststartdovrebbe fare esattamente questo.

Se la tua versione di FFmpeg non ha questa opzione, prendi in considerazione l'aggiornamento. Se non riesci a eseguire l'upgrade, puoi ottenere lo stesso risultato con uno dei seguenti strumenti:

  • QTIndexSwapper , un'applicazione Adobe AIR

  • MP4Box , gratuito e open source, che esegue un comando simile al seguente, in cui è possibile modificare l'intervallo (qui, 500):

    mp4box -inter 500 input.mp4

  • qt-faststart in Python , che funziona ovunque sia installato Python.

    qtfaststart input.mp4

Questo è tutto.

Controllo bitrate / qualità

Ora, naturalmente, per lo streaming potresti effettivamente voler limitare il bitrate per rimanere entro certi limiti. Puoi leggere di più al riguardo nel mio post sul blog sui metodi di controllo delle tariffe .

Ad esempio, aggiungendo -maxrate 2M -bufsize 2Malle opzioni di codifica, si limita la codifica a 2 Mbit / s, che può essere sufficiente per video a 720p. Il bitrate richiesto dipenderà, ovviamente, dalla complessità del contenuto. Questo richiede alcuni tentativi ed errori.


grazie, lo faccio allo stesso modo, ma sembra ancora il problema con il video :( lo faccio ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4allora mp4boxe mp4 non può cercare e nginx segnala 500 internal server errorper il parametro di avvio più di questo 0. Quando il video è codificato senza -vcoded libx264(codificatore mp4 predefinito) tutto il file di lavoro (ma qualità! malato!) :( (scusate, ora, non è consentito votare la vostra risposta)
abrahab

Sembra un problema con il plugin h.264 con NginX piuttosto che con qualsiasi problema di conversione video. Non sono l'esperto di streaming video web in sé, ma vedo che hai già chiesto informazioni su Stack Overflow? stackoverflow.com/questions/11079748/...
slhck

Sto anche pensando che forse nginx non è in grado di leggere correttamente questo formato video. anche i video di YouTube vengono riprodotti bene. sì, mi viene chiesto in pila riguardo al problema di nginx, ma sembra che non ci siano risposte. :(
abrahab,

3
+1 per -movflags faststartesattamente quello di cui avevo bisogno
andava il

il link è morto, è necessario utilizzare web.archive.org: web.archive.org/web/20140201142344/http://www.longtailvideo.com/…
malat

5

Puoi semplicemente convertire un AVI o MP4 non streaming, anche senza ricodificare tutto, facendo questo:

ffmpeg -i INPUT.mp4 -c copy -movflags faststart STREAMABLE_OUTPUT.mp4

Non è necessario ricodificare nulla, perché solo l'atomo moov deve essere spostato.


-1

Puoi provarlo con ffmpeg:

ffmpeg.exe -i "INPUT_FILE.AVI" -threads 2 -s 800x600 -r 25.00 -threads 1 -pix_fmt yuv420p -g 300 -qmin 3 -b 2048k -async 1 -acodec pcm_s16le -ar 22050 -ac 1 -ab 128k -y "OUTPUT_FILE.mp4"

5
Audio stereo PCM 22 kHz per video streaming Internet? Non sembra troppo efficiente. E allora perché dovresti impostare il bitrate audio su 128k?
slhck,

@slhck, puoi cambiare da 22k a 44k sostituendo "-ar 22050" con "ar 44100"
Searush,

1
@SEARAS Il problema non è la frequenza di campionamento. È il fatto che l'audio è stereo PCM non compresso. Per lo streaming su Internet. Questo non figura.
slhck,

Questa risposta è di qualità molto bassa e dovrebbe essere rimossa. I parametri possono cambiare il framerate, la risoluzione video e la frequenza di campionamento audio del contenuto e produrre risultati inefficienti o di bassa qualità (ffmpeg può scegliere da sé parametri più sicuri o migliori). Le prestazioni sono paralizzate dalla limitazione a un numero inferiore di thread e non funzionano nemmeno con -acodec pcm_s16le(errore:) Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument. Una buona ragione come una bozza IETF sul perché scegliere esattamente questi parametri sembra mancare.
LiveWireBT,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.