He estado golpeando mi cabeza contra esta pared durante mucho tiempo. Esperando que todos puedan superarme.
Tengo una transmisión en vivo proveniente de una cámara IP a mi computadora.
Nginx publica en YouTube y en una transmisión FFmpeg que toma un cuadro cada minuto para usarlo como una imagen de cámara web estática.
Aquí está el código con exec_push que he intentado usar sin éxito. La transmisión de YouTube y la captura de fotogramas funcionan bien. Tengo FFmpeg instalado con freetype. Todo esto está en MacOS X 10.15.4 Catalina con FFmpeg casero --HEAD instalado.
Actualización: también debo decir que he intentado generar la superposición usando la línea de comando FFmpeg y funciona muy bien con este comando:
/usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -vf drawtext="fontfile=/System/Library/Fonts/Supplemental/Arial.ttf:text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2" /Users/user/Desktop/test.mp4Entonces parece que la parte de salida es la parte que a FFmpeg no le gusta en Nginx.conf
Mi idea es que debería pasar la transmisión FFmpeg superpuesta a la aplicación "superpuesta" y publicar la transmisión en Youtube y capturar el cuadro desde allí. (Y también potencialmente grabado).
Actualización: cuando he intentado apuntar a un archivo sh para ejecutar el comando en lugar del FFmpeg exec_push directo, obtengo:
[alert] 56849#0: kevent() error on 15 filter:-1 flags:4002 (2: No such file or directory)¡Muchas gracias!
rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -vf drawtext="fontfile=/System/Library/Fonts/Supplemental/Arial.ttf:textfile=/Users/Shared/overlayescaped.txt: reload=1: fontcolor=white: fontsize=20: box=1: boxcolor=black@1: boxborderw=75: x=70: y=925" -c:v libx264 -maxrate 6000k -bufsize 4000k -c:a aac -b:a 160k -ar 44100 -b:a 128k -f mp4 rtmp://localhost:1935/overlay/test; #push rtmp://localhost:1935/overlay; } application overlay { live on; record off; push rtmp://a.rtmp.youtube.com app=live2 playpath=yourstreamkey; exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/overlay/$name -vf fps=1/60 /Users/Shared/stream/netcam.jpg; } } }La respuesta fue:
a) Debo invocar el comando Ffmpeg a través de un archivo para que esto funcione. No estoy del todo seguro de por qué, pero así son las cosas.
b) Antes no podía obtener información de registro de Ffmpeg. Fue porque estaba iniciando sesión en el lugar equivocado. Necesitaba iniciar sesión en /tmp/ debido al usuario sin privilegios (nadie) utilizado por Nginx. Tiene sentido.
c) En ese momento, una vez que el comando estaba funcionando desde un archivo, pude ver los errores reales que arrojaba Ffmpeg y pude solucionarlos. Lo que tuvo mucho que ver con la ubicación de las opciones, el espaciado y la garantía de que es un contenedor flv, no un contenedor mp4.
Aquí está la configuración de Nginx rtmp con la que terminé:
rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; meta copy; exec /Users/Shared/ffmpegcommand.sh $name; } application overlay { live on; record off; meta copy; push rtmp://a.rtmp.youtube.com app=live2 playpath=stream-key; exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/overlay/$name -vf fps=1/60 /Users/Shared/stream/netcam.jpg; } } }Y aquí está el comando Ffmpeg que estoy usando en el archivo de comandos para la superposición de texto (ahora usando -filter_complex, ya que -vf no era la opción adecuada en este caso).
/usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -filter_complex drawtext="fontfile=/System/Library/Fonts/Supplemental/Verdana.ttf: textfile=/Users/Shared/overlayescaped.txt: reload=1: fontcolor=white: fontsize=17: box=1: boxcolor=black@1: boxborderw=80: x=80: y=935" -c:v libx264 -level 4.1 -maxrate 6000k -bufsize 4000k -c:a copy -f flv rtmp://localhost:1935/overlay/newlive 2>>/tmp/ffmpeg.errorTambién modifiqué las opciones de audio para que se copien directamente desde la fuente ya que no se necesita codificación.
Finalmente, creé el archivo de texto superpuesto a partir de un archivo de texto que ya tenía. La superposición existente tenía un símbolo de % para la humedad, así que tuve que escapar de ese carácter usando sed en un script bash.
escovlfiletmp='/Users/Shared/overlayescapedtmp.txt' escovlfile='/Users/Shared/overlayescaped.txt' overlaysearch="% B:" overlayreplace="\\\\\\% B:" sed -e "s/${overlaysearch}/${overlayreplace}/g" ${overlayfile} > ${escovlfile}He adjuntado una captura de pantalla del resultado final de la transmisión de video. Toda el área negra es la superposición.
Muy feliz.
Gracias por todos los recursos en este sitio web y en otros lugares. Me tomó 4 días y muchas horas de búsqueda constante, pero logré juntarlo todo.