¿Cómo generar contenido de HLS de bitrate múltiple a partir de la transmisión en vivo de rtsp?

5

Estoy generando contenido hls en vivo de velocidad de bits única de la transmisión rtsp en vivo. Estoy usando el siguiente comando

ffmpeg -v verbose -i rtsp://127.0.0.1:8080/test.sdp \
 -vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 -profile:v baseline \
 -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header \
 -hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \
 -start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index1.m3u8

¿Cómo puedo modificar el comando ffmpg anterior para generar contenido de salida de velocidad de bits múltiple? Por favor, ayúdame.

prashantas
fuente

Respuestas:

6
ffmpeg -v verbose -i rtsp://127.0.0.1:8080/test.sdp \
-vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 \
-profile:v baseline -maxrate 400k -bufsize 1835k \
-pix_fmt yuv420p -flags -global_header \
-hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \
-start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index1.m3u8 \
-vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 \
-profile:v baseline -maxrate 700k -bufsize 1835k \
-pix_fmt yuv420p -flags -global_header \
-hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \
-start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index2.m3u8

y cree index.m3u8 apuntando a las secuencias anteriores:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000
hls/index1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700000
hls/index2.m3u8
vayvanne
fuente
Bienvenido a Super User. ¿Puede ampliar su respuesta para explicar qué hace este código y cómo aborda el problema? Se desaconseja el código inexplicable porque no enseña la solución. Gracias.
fijador1234
Estamos agregando la segunda salida con los mismos parámetros que primero pero -maxrate 700k y luego creando un índice de tasa de bits múltiple, m3u8 para ambas corrientes HLS.
vayvanne
3

El concepto que necesita para generar múltiples salidas desde una sola entrada con ffmpeg se demuestra muy claramente (al menos para mí lo fue) en https://trac.ffmpeg.org/wiki/Creating%20multiple%20outputs

Básicamente, ffmpeg -i someinput [output_options] someoutput1 [output2_options] someoutput2es el patrón. Parece que ya sabes cómo usar el rtsp como entrada y sabes cómo generar una única salida con una tasa de bits determinada. También debe repetir todo el bloque de salida (todo después de su cadena de entrada rtsp), y cada vez cambiar su resolución -sy su tasa de bits (está usando -crf, por lo que querrá disminuirlo para obtener una resolución más alta / mayor calidad y aumentar para baja resolución, menor calidad).

Personalmente, usaría crf para las representaciones de HLS y con libx265, la regla que uso es frame_width * frame_height * frame_rate * 0.1obtener la tasa de bits "ideal" para un tamaño de cuadro dado. Tendrá que cambiar la ecuación si desea seleccionar bitrates para apuntar, luego averiguar el tamaño de fotograma a partir de eso. El valor ".1" puede ir más alto, pero no verá muchos beneficios en general (el contenido más complejo utilizará mejor un valor más alto) y rara vez voy por debajo de 0.07.

rainabba
fuente