2011-12-23 15 views
33

ffmpeg -i infile.avi out.mp4 output MP4 non frammentato.Come stampare mp4 frammentato con ffmpeg?

Come ottengo l'mp4 frammentato?

Aggiornamento Un file MP4 frammentato è diviso internamente in blocchi diversi back-to-back o MPEG-4 frammenti di film. Ogni chunk ha il suo moof atom - quindi ci sono diversi moof atomi interlacciati nel file invece di un singolo moov alla fine come nel caso di un mp4 non frammentato. Ciò semplifica lo streaming su reti lente in cui è implicato il buffering

Esistono diversi strumenti come mp4box che convertono un normale mp4 in uno frammentato. Purtroppo non possiamo usare qualcosa di simile

ffmpeg <options to output mp4> | mp4box 

poiché ffmpeg non produce uscita seekable mentre produce contenitori mp4.

+2

Si potrebbe desiderare di aggiungere alcune informazioni su cosa sia un" mp4 frammentato "per rendere questo problema più accessibile alle persone che potrebbero conoscere bene ffmpeg, ma non mp4s frammentati. – blahdiblah

+0

Buon punto! Ho modificato la mia domanda –

+0

@SaptarshiBis hai risolto questo problema senza utilizzare mp3box? puoi condividere la soluzione? grazie – abrahab

risposta

40

Questo dovrebbe fare il trucco:

ffmpeg -re -i infile.ext -g 52 \ 
-strict experimental -acodec aac -ab 64k -vcodec libx264 -vb 448k \ 
-f mp4 -movflags frag_keyframe+empty_moov \ 
output.mp4 
  • frag_keyframe cause uscita frammentato,
  • empty_moov farà sì che l'uscita di essere frammentato 100%; senza questo il primo frammento sarà messo a punto come cortometraggio (usando moov) seguito dal resto del supporto in frammenti,
  • -re è utile quando lo streaming live (uscita su bitrate multimediale), non lo usa se stai creando un file,
  • -g 52 forze (almeno) ogni fotogramma 52a di essere un fotogramma chiave

per calcolare un intervallo di fotogrammi chiave sano vedere i paragrafi sui fragment sizes nella documentazione del mio server di streaming. - Puoi anche prendere in considerazione l'utilizzo di WebM, che è un'alternativa gratuita a H.264 (e ha un supporto migliore su alcune piattaforme rispetto a mp4 frammentato).

Nota importante: muxer di FFmpeg imposterà il Durata in entrambe le tkhd e mdhd atomi 0xffffffff per ogni traccia. Ciò causa problemi ad alcuni giocatori (ad esempio Quicktime non riprodurrà tali file). Dovresti trovare uno strumento e cambiarlo a zero (0x00000000).

+3

è simile a -movflags + le opzioni faststart sono state aggiunte di recente a FFmpeg ... – rogerdpack

+1

In caso di problemi con il comando precedente, potrebbe essere necessario reinstallare ffmpeg. Per installare tramite brew con tutte le opzioni: ** brew install ffmpeg --with-fdk-aac --with-ffplay --with-freetype --with-frei0r --with-libass --with-libvo-aacenc - -with-libvorbis --with-libvpx --with-opencore-amr --with-openjpeg --with-opus --with-rtmpdump --with-schroedinger --with-speex --with-theora --with- tools ** –

+1

È possibile trasmettere l'output in HTML5 invece di salvarlo in un file? Con il protocollo http? – astralmaster

2

ffmpeg -h (ma non la pagina man) ha il seguente:

mp4 muxer AVOptions: 
-movflags   <flags> E.... MOV muxer flags 
    rtphint     E.... Add RTP hint tracks 
-moov_size   <int> E.... maximum moov size so it can be placed at the 
           beginning 
-frag_size   <int> E.... maximum fragment size 
-frag_duration  <int> E.... maximum fragment duration 
-rtpflags   <flags> E.... RTP muxer flags 
    latm     E.... Use MP4A-LATM packetization instead of 
           MPEG4-GENERIC for AAC 
-skip_iods   <int> E.... Skip writing iods atom. 
-iods_audio_profile <int> E.... iods audio profile atom. 
-iods_video_profile <int> E.... iods video profile atom. 

non saprei come identificare un mp4 frammentato se ho visto uno, ma sembra che ffmpeg ha qualche (scarsamente documentata) supporto per loro.

+2

re: "Non saprei come identificare un mp4 frammentato se ne vedessi uno" :) sembrano uguali allo stesso modo. :) C'è un atomo 'mvex' vicino alla parte anteriore del 'moov' per farti sapere che sarà frammentato. Ci saranno poche informazioni effettive sui dati nei vari sotto-atomi della traccia. Ci saranno coppie 'mof' '' moof 'di livello superiore in cui si trovano i dati reali. Potrebbe esserci un atomo 'mfra' alla fine. –

+0

'mp4box -info file' indicherà se l'MP4 è frammentato. – Mulvya

4

AGGIORNAMENTO: Considerando un file MP4 frammentato come ISMV (Smooth Streaming). La nuova versione FFMPEG 0.10, dal 27 gennaio 2012 è in grado di mux in questo formato.

ismv muxer AVOptions: 
-movflags   <flags> E.... MOV muxer flags 
    rtphint     E.... Add RTP hint tracks 
    empty_moov    E.... Make the initial moov atom empty (not supported by QuickTime) 
    frag_keyframe   E.... Fragment at video keyframes 
    separate_moof   E.... Write separate moof/mdat atoms for each track 
    frag_custom    E.... Flush fragments on caller requests 
    isml     E.... Create a live smooth streaming feed (for pushing to a publishing point) 
-moov_size   <int> E.... maximum moov size so it can be placed at the begin 
-rtpflags   <flags> E.... RTP muxer flags 
    latm     E.... Use MP4A-LATM packetization instead of MPEG4-GENERIC for AAC 
    rfc2190     E.... Use RFC 2190 packetization instead of RFC 4629 for H.263 
    skip_rtcp    E.... Don't send RTCP sender reports 
-skip_iods   <int> E.... Skip writing iods atom. 
-iods_audio_profile <int> E.... iods audio profile atom. 
-iods_video_profile <int> E.... iods video profile atom. 
-frag_duration  <int> E.... Maximum fragment duration 
-min_frag_duration <int> E.... Minimum fragment duration 
-frag_size   <int> E.... Maximum fragment size 
-ism_lookahead  <int> E.... Number of lookahead entries for ISM files 
0

Forse questo aiuterà. Nell'esempio seguente, ffmpeg prende una COPIA di un feed RTMP e quindi usa ffmpeg, crea un output HTTP in fMP4 che può essere accettato dai punti di ingresso di IIS o Azure.

Nota: il codificatore originale viene impostato sull'intervallo di fotogrammi chiave di 2 secondi.

"ffmpeg -i rtmp: // ip del server: 1935/nome/streamkey -vcodec copia -acodec copia -nal-HRD cbr -movflags ISML + frag_keyframe + separate_moof -f ismv http://url del punto di entrata/entry-point .isml/Streams (feed1) "

Problemi correlati