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.