¿Cómo generar m3u8 a partir de una lista de archivos en ffmpeg?

¿Cómo generar m3u8 a partir de una lista de archivos en ffmpeg?

Digamos que tengo esta lista de archivos: audios:

file1.mp3 //audiotrack 1
file2.mp3 //audiotrack 2
file3.mp3 //audiotrack 3

subtítulos:

file1.vtt //subtitle 1
file2.vtt //subtitle 2
file3.vtt //subtitle 3

vídeos:

file1_320x280.mp4 //video quality 1
file2_640x11024.mp4 //video quality 2
file3_1200x1600.mp4 //video quality 3

¿Cómo convertir con FFMPEG todos estos archivos a fragmentos .TS con un archivo m3u8?

¿La extensión video.js HLS también permitirá al usuario elegir la calidad?

Respuesta1

No soy un profesional en este ámbito, pero así es como lo manejo.

Referencias: Ejemplo perfecto de manifiesto que deseas.

En primer lugar:

Crea listas de reproducción .m3u8 para cada vídeo

ffmpeg -i file1_320x280.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls file1_320x280.m3u8

ffmpeg -i file2_640x11024.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls file2_640x11024.m3u8

ffmpeg -i file3_1200x1600.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls file3_1200x1600.m3u8

En segundo lugar:

Crea listas de reproducción .m3u8 para cada audio (yo uso el mismo comando que para el video)

ffmpeg -i file1.mp3 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls file1_320x280.m3u8

ffmpeg -i file2.mp3 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls file2.m3u8

ffmpeg -i file3.mp3 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls file3.m3u8

Luego creo manualmente archivos .m3u8 para cada subtítulo con dicho contenido:

#EXTM3U
#EXT-X-TARGETDURATION: <<VIDEO RUNTIME HERE>>
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF: <<VIDEO RUNTIME HERE>>,
file1.vtt
#EXT-X-ENDLIST

Donde #EXTINF y #EXT-X-TARGETDURATION son la duración de un vídeo en segundos. Por ejemplo (supongamos que la duración del vídeo es 00:14:47):

sub1.m3u8:

#EXTM3U
#EXT-X-TARGETDURATION:887
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:887.0,
file1.vtt
#EXT-X-ENDLIST

sub2.m3u8:

#EXTM3U
#EXT-X-TARGETDURATION:887
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:887.0,
file2.vtt
#EXT-X-ENDLIST

sub3.m3u8:

#EXTM3U
#EXT-X-TARGETDURATION:887
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:887.0,
file3.vtt
#EXT-X-ENDLIST

Finalmente, creo manualmente el archivo master.m3u8 con el siguiente contenido para este ejemplo:

#EXTM3U

#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="stereo",LANGUAGE="lang",NAME="Some audio name",DEFAULT=YES,AUTOSELECT=YES,URI="file1.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="stereo",LANGUAGE="lang2",NAME="Some audio name",DEFAULT=NO,AUTOSELECT=YES,URI="file2.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="stereo",LANGUAGE="lang3",NAME="Some audio name",DEFAULT=NO,AUTOSELECT=YES,URI="file3.m3u8"

#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Deutsch",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="de",URI="sub1.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",URI="sub2.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Espanol",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="es",URI="sub3.m3u8"

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=258157,CODECS="avc1.4d400d,mp4a.40.2",AUDIO="stereo",RESOLUTION=320x280,SUBTITLES="subs"
file1_320x280.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=520929,CODECS="avc1.4d4015,mp4a.40.2",AUDIO="stereo",RESOLUTION=file2_640x11024,SUBTITLES="subs"
file2_640x11024.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1144430,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="stereo",RESOLUTION=1200x1600,SUBTITLES="subs"
file3_1200x1600.m3u8

información relacionada