2011-12-23 15 views
33

ffmpeg -i infile.avi out.mp4 salidas MP4 no fragmentadas.Cómo generar salida de mp4 fragmentado con ffmpeg?

¿Cómo obtengo el mp4 fragmentado?

actualización Un archivo mp4 fragmentada está dividido internamente en varios trozos-espalda con espalda o MPEG-4 fragmentos de películas. Cada fragmento tiene su propio átomo moof, por lo que hay varios moof átomos intercalados en el archivo en lugar de un único moov al final como en el caso de un mp4 no fragmentado. Esto facilita la transmisión a través de redes lentas donde está involucrado el almacenamiento en memoria intermedia

Hay varias herramientas como mp4box que convierten un mp4 normal en uno fragmentado. Desafortunadamente, no podemos usar algo como esto

ffmpeg <options to output mp4> | mp4box 

desde ffmpeg no produce salida reubicable, mientras que la producción de recipientes mp4.

+2

Es posible que desee agregar algo de información acerca de qué es un" mp4 fragmentado "para que este problema sea más accesible para las personas que puedan conocer bien ffmpeg, pero no mp4 fragmentados. – blahdiblah

+0

¡Buen punto! He editado mi pregunta –

+0

@SaptarshiBis ¿resuelves este problema sin usar el mp3box? ¿puedes compartir la solución? gracias – abrahab

Respuesta

40

Esto debe hacer el truco:

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 causas salida fragmentado,
  • empty_moov hará que la salida sea 100% fragmentada; sin esto, el primer fragmento se muxará como una película corta (usando moov) seguido por el resto del medio en fragmentos,
  • -re es útil cuando se transmite en vivo (salida en velocidad de bits de medios), no lo use si está creando un archivo,
  • -g 52 fuerzas (por lo menos) cada cuadro 52a sea un fotograma clave

para calcular un intervalo de fotogramas clave sana consulte los párrafos sobre fragment sizes en la documentación de mi servidor de streaming. - También puede considerar usar WebM, que es una alternativa gratuita a H.264 (y tiene mejor soporte en algunas plataformas que en mp4 fragmentado).

Nota importante: muxor de FFMpeg fijará el Duración en ambos tkhd y mdhd átomos a 0xffffffff para cada pista. Esto causa problemas en algunos jugadores (por ejemplo, Quicktime no reproducirá dichos archivos). Debería encontrar una herramienta y cambiarla a cero (0x00000000).

+3

parece que las opciones -movflags + faststart se agregaron recientemente a FFmpeg ... – rogerdpack

+1

Si tiene problemas con el comando anterior, puede necesitar reinstalar ffmpeg. Para instalar a través de brew con todas las opciones: ** 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- herramientas ** –

+1

¿Es posible transmitir el resultado a HTML5 en lugar de guardarlo en un archivo? Con el protocolo http? – astralmaster

2

ffmpeg -h (pero no la página del manual) tiene el siguiente:

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. 

no sabría cómo identificar un mp4 fragmentada si vi uno, pero parece ffmpeg tiene algo (poco documentada) apoyo para ellos.

+2

re: "No sabría cómo identificar un mp4 fragmentado si lo viera" :) se parecen mucho. :) Hay un átomo 'mvex' cerca del frente del 'moov' para hacerle saber que estará fragmentado. Habrá muy poca información de datos reales en los diversos subátomos de seguimiento. Habrá pares de nivel superior 'moof' 'mdat', que es donde residen los datos reales. Puede haber un átomo 'mfra' al final. –

+0

'mp4box -info file' indicará si el MP4 está fragmentado. – Mulvya

4

ACTUALIZACIÓN: Considerando un archivo MP4 fragmentado como ISMV (Smooth Streaming). La nueva versión FFMPEG 0.10, desde el 27 de enero de 2012, es capaz de cambiar a este 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

Quizás esto ayude. En el siguiente ejemplo, ffmpeg toma una COPIA de un feed RTMP y luego usa ffmpeg, crea una salida HTTP en fMP4 que puede ser aceptada por los puntos de entrada de IIS o Azure.

Nota: el codificador original está configurado en un intervalo de fotograma clave de 2 segundos.

"ffmpeg -i RTMP: // ip del servidor: 1935/nombre/streamkey -vcodec copia copia -acodec -nal-HRD CBR -movflags ISML + + frag_keyframe separate_moof -f ismv http://url del punto de entrada/punto de entrada .isml/Streams (feed1) "

Cuestiones relacionadas