Configuración de una plataforma de transmisión automática en vivo

Preparación inicial

1. Adquirir un servidor de aplicaciones ligero con la siguiente configuración:

Aproximadamente 65 CNY mensuales

2. Obtener el video a transmitir en formato MP4 con resolución 1080p a 30 cuadros por segundo

Instalación del entorno

1. Después de iniciar sesión en la terminal, ejecutar el siguiente comando para instalar screen:
yum -y install screen
Una vez completado, utilizar el comando screen -S stream para acceder a una ventana llamada "stream" dentro de la herramienta de gestión de ventanas screen

2. Crear un directorio para almacenar la herramienta de codificación de video ffmpeg:
mkdir /home/lighthouse/ffmpg

3. Acceder al directorio recién creado:
cd /home/lighthouse/ffmpg

4. Copiar el siguiente script para instalar ffmpeg

#!/bin/bash
RUTA=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export RUTA
#=================================================================#
#   Sistema Requerido: CentOS7 X86_64                             #
#   Descripción: Servidor de Medios FFmpeg                        #
#   Autor: Administrador                                          #
#=================================================================#

color_rojo='\033[0;31m'
color_verde='\033[0;32m'
color_amarillo='\033[0;33m'
estilo="\033[0m"

instalar_ffmpeg(){
read -p "Ya tienes ffmpeg4.x instalado? Se requiere ffmpeg para transmitir. deseas instalarlo ahora?(si/no):" respuesta
if [ $respuesta = "si" ];then
    yum -y install wget
    wget --no-check-certificate https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xz
    tar -xJf ffmpeg-4.0.3-64bit-static.tar.xz
    cd ffmpeg-4.0.3-64bit-static
    mv ffmpeg /usr/bin && mv ffprobe /usr/bin && mv qt-faststart /usr/bin && mv ffmpeg-10bit /usr/bin
fi
if [ $respuesta = "no" ]
then
    echo -e "${color_amarillo} Has elegido no instalar FFmpeg. Asegurate de tener FFmpeg instalado, de lo contrario el programa no funcionara! ${estilo}"
    sleep 2
fi
}

iniciar_transmision(){
read -p "Ingresa tu direccion de transmision y clave (protocolo rtmp):" enlace_rtmp

if [[ $enlace_rtmp =~ "rtmp://" ]];then
    echo -e "${color_verde} La direccion es correcta, continuando con el siguiente paso. ${estilo}"
    sleep 2
else
    echo -e "${color_rojo} La direccion ingresada es invalida. Por favor ejecuta el programa nuevamente! ${estilo}"
    exit 1
fi

read -p "Ingresa el directorio de tus videos (solo formato mp4 y ruta absoluta, ejemplo /opt/video):" directorio_videos

read -p "Deseas agregar una marca de agua? Se ubicara en la esquina superior derecha y requiere buen CPU (si/no):" agregar_marca
if [ $agregar_marca = "si" ];then
    read -p "Ingresa la ruta absoluta de tu imagen de marca de agua, ejemplo /opt/imagen/logo.jpg (formatos jpg/png/bmp):" ruta_imagen
    echo -e "${color_amarillo} Marca de agua configurada, comenzando transmision. ${estilo}"
    while true
    do
        cd $directorio_videos
        for video in $(ls *.mp4)
        do
        ffmpeg -re -i "$video" -i "$ruta_imagen" -filter_complex overlay=W-w-5:5 -c:v libx264 -c:a aac -b:a 192k -strict -2 -f flv ${enlace_rtmp}
        done
    done
fi
if [ $agregar_marca = "no" ]
then
    echo -e "${color_amarillo} Has elegido no agregar marca de agua, comenzando transmision. ${estilo}"
    while true
    do
        cd $directorio_videos
        video=$(find ./ -type f | shuf -n 1)
        ffmpeg -re -i "$video" -preset ultrafast -vcodec libx264 -g 60 -b:v 1500k -c:a aac -b:a 128k -strict -2 -f flv ${enlace_rtmp}
    done
fi
}

detener_transmision(){
    screen -S stream -X quit
    killall ffmpeg
}

echo -e "${color_amarillo} CentOS7 X86_64 FFmpeg Transmision Automatica循环推流 ${estilo}"
echo -e "${color_rojo} Verifica que este script se ejecute dentro de una ventana screen! ${estilo}"
echo -e "${color_verde} 1.Instalar FFmpeg (se requiere para transmitir) ${estilo}"
echo -e "${color_verde} 2.Iniciar transmision automatica ${estilo}"
echo -e "${color_verde} 3.Detener transmision ${estilo}"

menu_principal(){
    read -p "Ingresa un numero(1-3) para seleccionar la operacion:" opcion
    case "$opcion" in
        1)
        instalar_ffmpeg
        ;;
        2)
        iniciar_transmision
        ;;
        3)
        detener_transmision
        ;;
        *)
        echo -e "${color_rojo} Por favor ingresa un numero valido (1-3) ${estilo}"
        ;;
    esac
}

menu_principal

Después de copiar y pegar el script anterior, ejecutar el comando start_menu, presionar Enter, luego seleccionar la opción 1 y presionar Enter para instalar ffmpeg

5. Para verificar si ffmpeg se instaló correctamente, ejecutar el comando start_menu, presionar Enter y seleccionar la opción 2. Si aparece la solicitud para ingresar la clave de transmisión, significa que la instalación fue exitosa. Utilizar ctrl+c para salir del estado de entrada

Preparación de videos

1. Crear un directorio para almacenar los videos:
mkdir /home/lighthouse/video
Ver el directorio video creado: cd /home/lighthouse

2. Subir los videos al directorio video:
put [ruta absoluta del video] [ruta de destino en el servidor]

Iniciar la transmisión

Tomando Bilibili como ejemplo:

1. Ejecutar el comando start_menu, presionar Enter, luego ingresar 2 y presionar Enter. Aparecerá la solicitud para ingresar la clave de transmisión. Luego, en la sala de transmisión de Bilibili, activar la transmisión en vivo, copiar la dirección del servidor, pegarla después de la clave de transmisión, y tammbién copiar la clave de flujo y colocarla después de la dirección del servidor. Recordar agregar "/" entre la clave de flujo y la dirección del servidor si no existe. Después de completar estas entradas, presionar Enter

2. Después de completar el paso anterior, se solicitara ingresar el directorio de almacenamiento de videos. Ingresar el directorio donde se subió el video

3. Preguntará si desea agregar una marca de agua. Se recomienda no hacerlo, ya que consume muchos recursos del CPU

Notas importantes

1. Explicación del comando:

ffmpeg -re -i "$video" -preset ultrafast -vcodec libx264 -g 60 -b:v 1500k -c:a aac -b:a 128k -strict -2 -f flv ${rtmp}

-preset: modo de codificacion
ultrafast: codificacion mas rapida
-vcodec libx264: codificador H.264
-b:v 1500k: tasa de bits de video, para transmisiones国内建议1500k, para internacionales se puede usar 3000k o mas
-b:a 128k : tasa de bits de audio, 92k o 128k funcionan bien

2. Métodos de administración del servidor:
Abrir terminal remoto y conectarse mediante SSH:
Ver ventanas screen activas: screen -ls
Ejecutar ventana de transmisión en segundo plano: screen -d [nombre de ventana]
Cerrar ventana de transmisión en segundo plano: screen -X -S [nombre de ventana] quit
Después de cerrar la ventana de transmisión en segundo plano, recordar desactivar la sala de transmisión asociada

Reproducción de diferente contenido según el horario

#!/bin/bash
RUTA=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export RUTA
#=================================================================#
#   Sistema Requerido: CentOS7 X86_64                             #
#   Descripción: Servidor de Medios FFmpeg                        #
#   Autor: Administrador                                          #
#=================================================================#

color_rojo='\033[0;31m'
color_verde='\033[0;32m'
color_amarillo='\033[0;33m'
estilo="\033[0m"

hora_inicio_manana="05:59:59"
hora_inicio_tarde="11:59:59"
hora_inicio_ afternoon="13:59:59"
hora_inicio_noche="17:59:59"
hora_inicio_dormir="21:59:59"

contador=0
cantidad_anuncios=4

instalar_ffmpeg(){
read -p "Ya tienes ffmpeg4.x instalado? Se requiere ffmpeg para transmitir. deseas instalarlo ahora?(si/no):" respuesta
if [ $respuesta = "si" ];then
    yum -y install wget
    wget --no-check-certificate https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xz
    tar -xJf ffmpeg-4.0.3-64bit-static.tar.xz
    cd ffmpeg-4.0.3-64bit-static
    mv ffmpeg /usr/bin && mv ffprobe /usr/bin && mv qt-faststart /usr/bin && mv ffmpeg-10bit /usr/bin
fi
if [ $respuesta = "no" ]
then
    echo -e "${color_amarillo} Has elegido no instalar FFmpeg. Asegurate de tener FFmpeg instalado, de lo contrario el programa no funcionara! ${estilo}"
    sleep 2
fi
}

iniciar_transmision(){
read -p "Ingresa tu direccion de transmision y clave (protocolo rtmp):" enlace_rtmp

if [[ $enlace_rtmp =~ "rtmp://" ]];then
    echo -e "${color_verde} La direccion es correcta, continuando. ${estilo}"
    sleep 2
else
    echo -e "${color_rojo} La direccion es invalida. Ejecuta nuevamente! ${estilo}"
    exit 1
fi

read -p "Ingresa el directorio de videos (solo mp4 y ruta absoluta):" directorio_videos

read -p "Agregar marca de agua? Requiere buen CPU (si/no):" agregar_marca
if [ $agregar_marca = "si" ];then
    read -p "Ruta de imagen de marca de agua:" ruta_imagen
    echo -e "${color_amarillo} Marca de agua configurada. ${estilo}"
    while true
    do
        cd $directorio_videos
        for video in $(ls *.mp4)
        do
        ffmpeg -re -i "$video" -i "$ruta_imagen" -filter_complex overlay=W-w-5:5 -c:v libx264 -c:a aac -b:a 192k -strict -2 -f flv ${enlace_rtmp}
        done
    done
fi
if [ $agregar_marca = "no" ]
then
    echo -e "${color_amarillo} Sin marca de agua, comenzando transmision. ${estilo}"
    while true
    do
        let contador=contador+1
        if [ $contador -ge $cantidad_anuncios ];then
            contador=0
        fi
        residuo=$((contador % cantidad_anuncios))

        fecha_hoy=$(date +"%Y-%m-%d")
        fecha_manana=$(date -d "$fecha_hoy + 1 day" +%Y-%m-%d)

        hora_inicio_manana_completa="$fecha_hoy $hora_inicio_manana"
        hora_inicio_tarde_completa="$fecha_hoy $hora_inicio_tarde"
        hora_inicio_afternoon_completa="$fecha_hoy $hora_inicio_afternoon"
        hora_inicio_noche_completa="$fecha_hoy $hora_inicio_noche"
        hora_inicio_dormir_completa="$fecha_hoy $hora_inicio_dormir"
        hora_inicio_manana_siguiente="$fecha_manana $hora_inicio_manana"

        tiempo_actual=$(date +"%Y-%m-%d %H:%M:%S")

        if [ $residuo -ne 0 ]; then
            directorio_contenido="$directorio_videos/anuncios"
        elif [ "$tiempo_actual" -ge "$hora_inicio_manana_completa" ] && [ "$tiempo_actual" -lt "$hora_inicio_tarde_completa" ]; then
            directorio_contenido="$directorio_videos/manana"
        elif [ "$tiempo_actual" -ge "$hora_inicio_tarde_completa" ] && [ "$tiempo_actual" -lt "$hora_inicio_afternoon_completa" ]; then
            directorio_contenido="$directorio_videos/tarde"
        elif [ "$tiempo_actual" -ge "$hora_inicio_afternoon_completa" ] && [ "$tiempo_actual" -lt "$hora_inicio_noche_completa" ]; then
            directorio_contenido="$directorio_videos/ afternoon"
        elif [ "$tiempo_actual" -ge "$hora_inicio_noche_completa" ] && [ "$tiempo_actual" -lt "$hora_inicio_dormir_completa" ]; then
            directorio_contenido="$directorio_videos/noche"
        elif [ "$tiempo_actual" -ge "$hora_inicio_dormir_completa" ] && [ "$tiempo_actual" -lt "$hora_inicio_manana_siguiente" ]; then
            directorio_contenido="$directorio_videos/dormir"
        fi

        cd $directorio_contenido
        video=$(find ./ -type f | shuf -n 1)
        ffmpeg -re -i "$video" -preset ultrafast -vcodec libx264 -g 60 -b:v 1500k -c:a aac -b:a 128k -strict -2 -f flv ${enlace_rtmp}
    done
fi
}

detener_transmision(){
    screen -S stream -X quit
    killall ffmpeg
}

echo -e "${color_amarillo} CentOS7 X86_64 FFmpeg Transmision Automatica ${estilo}"
echo -e "${color_rojo} Ejecutar dentro de screen! ${estilo}"
echo -e "${color_verde} 1.Instalar FFmpeg ${estilo}"
echo -e "${color_verde} 2.Iniciar transmision ${estilo}"
echo -e "${color_verde} 3.Detener transmision ${estilo}"

menu_principal(){
    read -p "Selecciona operacion (1-3):" opcion
    case "$opcion" in
        1)
        instalar_ffmpeg
        ;;
        2)
        iniciar_transmision
        ;;
        3)
        detener_transmision
        ;;
        *)
        echo -e "${color_rojo} Numero invalido (1-3) ${estilo}"
        ;;
    esac
}

menu_principal

Este script reproducirá videos de diferentes directorios según el horario del día, además de insertar anuncios según la cantidad especificada. Para su funcionamiento inicial, es necesario crear seis directorios con nombres específicos dentro del directorio de videos: anuncios, manana, tarde, afternoon, noche y dormir. Estos representan el directorio de anuncios, contenido matutino, vespertino, nocturno y para dormir respectivamente.

Combinación de audio y video

Puedes consultar recursos adicionales sobre cómo fusionar pistas de audio con video utilizando ffmpeg.

Etiquetas: centos FFmpeg streaming rtmp live-broadcast

Publicado el 7-19 04:27