high - ¿Cómo dar salida a mp4 fragmentado con ffmpeg?
ffmpeg quality parameters (4)
ffmpeg -i infile.avi out.mp4
genera MP4 no fragmentado.
¿Cómo obtengo el mp4 fragmentado?
Actualización Un archivo fragmentado mp4 se divide internamente en varios fragmentos consecutivos o fragmentos de película MPEG-4. 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 hace que sea más fácil de transmitir en redes lentas donde está involucrado el almacenamiento en búfer
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
ya que ffmpeg no produce salida buscable mientras produce contenedores mp4.
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
Esto debería funcionar:
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
causa salida fragmentada -
empty_moov
hará que la salida esté 100% fragmentada; sin esto, el primer fragmento se muxará como una película corta (usandomoov
) seguido por el resto de los medios, en fragmentos, -
-re
es útil cuando la transmisión en vivo (salida en velocidad de bits del medio), no lo use si está creando un archivo, -
-g 52
obliga (al menos) cada fotograma 52 a ser un fotograma clave
Para calcular un intervalo de fotograma clave saludable, consulte los párrafos sobre tamaños de fragmentos en los documentos de mi servidor de transmisión. - 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: el muxer de FFMpeg establecerá la Duración en átomos de tkhd
y mdhd
en 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).
Tal vez 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 / name / streamkey -vcodec copy -acodec copy -nal-hrd cbr -movflags isml + frag_keyframe + separate_moof -f ismv http: // url of entry point / entry-point .isml / Streams (feed1) "
ffmpeg -h
(pero no la página man) tiene lo 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 fragmentado si lo viera, pero parece que ffmpeg sí tiene algún soporte (poco documentado) para ellos.