Tutorial · FFmpeg para vídeo en directo
Tutorial de streaming con FFmpeg de un solo comando a un canal en directo
Este tutorial de streaming con FFmpeg te pone en directo con un solo comando: FFmpeg lee tu archivo, cámara o pantalla, lo codifica a vídeo H.264 y audio AAC, y lo envía por RTMP a tu canal de Primcast.
Encontrarás el comando para cada tipo de fuente, los ajustes del codificador que mantienen la reproducción fluida para tus espectadores y una versión SRT para conexiones largas o inestables.
ffmpeg -re -i input.mp4 \ -c:v libx264 -preset veryfast \ -b:v 2500k -maxrate 2500k -bufsize 5000k \ -pix_fmt yuv420p \ -force_key_frames "expr:gte(t,n_forced*2)" \ -sc_threshold 0 \ -c:a aac -b:a 128k -ar 44100 -ac 2 \ -f flv "rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream"
Sustituye las palabras resaltadas por tus propios valores. El paso 02 explica cada opción.
Antes de empezar: FFmpeg y cuatro valores de tu panel
Necesitas FFmpeg en el ordenador que envía el vídeo y los ajustes del codificador de tu canal. Ambos llevan un par de minutos.
Instalar FFmpeg
Usa el gestor de paquetes de tu sistema y comprueba que funciona. Cualquier versión actual sirve para los comandos de esta página.
# Windowswinget install Gyan.FFmpeg# macOS (Homebrew)brew install ffmpeg# Debian o Ubuntusudo apt install ffmpeg# comprobarffmpeg -version
Copia los ajustes de tu codificador
Inicia sesión, abre tu cuenta de vídeo y busca la tarjeta Streaming en directo. Su lista de Ajustes del codificador incluye todo lo que FFmpeg necesita:
- Servidor
- Tiene este aspecto:
rtmp://HOST:1935/APP. Tu host y el nombre de la aplicación. - Nombre del stream
- Normalmente
livestream. Va al final de la dirección. - Usuario
- Tu acceso de publicación.
- Contraseña
- Pulsa Mostrar para verla o Nueva contraseña para cambiarla.
Si tu panel también muestra una dirección de Servidor más cercano, usa esa como servidor. Así tu codificador se conecta a nuestra ubicación más próxima (Nueva York, Miami, San Francisco, Ámsterdam o Bucarest) y el stream viaja hasta tu canal por nuestra red. El nombre del stream, el usuario y la contraseña no cambian.
Tu primer stream RTMP con FFmpeg, opción por opción
Pon tu usuario y contraseña delante del host, seguidos de una @, y añade el nombre del stream después de la aplicación. El resto del comando le dice a FFmpeg cómo codificar.
rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream
Mantén las comillas alrededor de la dirección. Si tu contraseña contiene @, : o /, escríbelos como %40, %3A y %2F, o pulsa Nueva contraseña en el panel para obtener una sin ellos.
| Opción | Qué hace |
|---|---|
-re | Lee un archivo a su velocidad de reproducción real. Sin ella, FFmpeg envía el archivo tan rápido como puede y el stream se corta. Omítela para cámaras y dispositivos de captura, que ya funcionan en tiempo real. |
-i input.mp4 | Tu entrada: un archivo, un dispositivo u otro stream. El paso 03 tiene una para cada caso. |
-c:v libx264 | Codifica el vídeo como H.264, que cualquier reproductor y navegador puede mostrar. |
-preset veryfast | Cambia un poco de calidad por velocidad para que el ordenador siga el ritmo en tiempo real. Prueba faster o medium si te sobra CPU. |
-b:v 2500k -maxrate 2500k -bufsize 5000k | Mantiene el vídeo cerca de unos estables 2.500 kbps, para que el stream nunca pida más subida de la que tienes. El paso 04 tiene valores para cada resolución. |
-pix_fmt yuv420p | El formato de color que esperan móviles, televisores y navegadores. |
-force_key_frames "expr:gte(t,n_forced*2)" | Un fotograma clave cada 2 segundos, sea cual sea la tasa de fotogramas. La reproducción se divide en segmentos en los fotogramas clave, así que esta es la opción más importante. |
-sc_threshold 0 | Evita fotogramas clave extra en los cambios de escena, para que el ritmo de 2 segundos se mantenga fijo. |
-c:a aac -b:a 128k -ar 44100 -ac 2 | Audio estéreo AAC a 128 kbps y 44,1 kHz. El codificador AAC integrado de FFmpeg no necesita ninguna opción adicional. |
-f flv | Envuelve el stream en FLV, el formato que transporta RTMP. |
Las guías más antiguas, incluida la primera versión de esta página, añaden -strict experimental para AAC. FFmpeg eliminó la etiqueta experimental de su codificador AAC en la versión 3.0, así que puedes omitirla.
Elige tu fuente: archivo, webcam, pantalla o cámara IP
Solo cambia la parte de entrada. En todos los ejemplos, [encoding] representa las opciones de vídeo y audio del paso 02, y RTMP_ADDRESS tu dirección entre comillas.
Emitir un archivo de vídeo con FFmpeg
Añade -stream_loop -1 antes de la entrada para reproducirlo en bucle hasta que detengas FFmpeg.
ffmpeg -re -stream_loop -1 -i video.mp4 \ [encoding] -f flv "RTMP_ADDRESS"
Webcam en Windows
Primero lista tus dispositivos y luego usa los nombres exactos que imprime.
ffmpeg -list_devices true -f dshow -i dummy ffmpeg -f dshow -rtbufsize 256M ^ -i video="Your Camera":audio="Your Microphone" ^ [encoding] -f flv "RTMP_ADDRESS"
Webcam en macOS
La lista muestra cada cámara y micrófono con un número. "0:0" significa cámara 0 y micrófono 0.
ffmpeg -f avfoundation -list_devices true -i "" ffmpeg -f avfoundation -framerate 30 \ -video_size 1280x720 -i "0:0" \ [encoding] -f flv "RTMP_ADDRESS"
Webcam en Linux
Vídeo desde el dispositivo de cámara y sonido desde la entrada predeterminada de tu escritorio.
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 \ -i /dev/video0 -f pulse -i default \ [encoding] -f flv "RTMP_ADDRESS"
Tu pantalla en Windows
Captura todo el escritorio a 30 fotogramas por segundo. Añade un micrófono con una segunda entrada dshow si quieres sonido.
ffmpeg -f gdigrab -framerate 30 -i desktop ^ [encoding] -f flv "RTMP_ADDRESS"
Cámara IP por RTSP
Si la cámara ya envía H.264 con un intervalo de fotograma clave de 2 segundos (configurado en su propio menú), copia el vídeo tal cual y codifica solo el sonido. Si no, usa todas las opciones de codificación.
ffmpeg -rtsp_transport tcp \ -i "rtsp://CAM_USER:CAM_PASS@192.168.1.64:554/stream1" \ -c:v copy -c:a aac -b:a 128k \ -f flv "RTMP_ADDRESS"
¿La cámara no tiene micrófono? Sustituye las opciones de audio por -an.
Los ejemplos terminan las líneas con \ (macOS y Linux) o ^ (símbolo del sistema de Windows). En PowerShell, o si tienes dudas, pon todo el comando en una sola línea.
Ajustes del codificador FFmpeg que aguantan en directo
Elige una fila que se ajuste a tu velocidad de subida. Deja libre un tercio de tu subida: si una prueba de velocidad muestra 6 Mbps, no envíes más de unos 4.
| Imagen | Añadir al comando | Vídeo | Audio | Subida necesaria |
|---|---|---|---|---|
| 1080p, 30 fps | -vf scale=-2:1080 -r 30 | 4500k | 128k | 7 Mbps |
| 720p, 30 fps | -vf scale=-2:720 -r 30 | 2500k | 128k | 4 Mbps |
| 480p, 30 fps | -vf scale=-2:480 -r 30 | 1200k | 96k | 2 Mbps |
Ajusta -b:v y -maxrate a la cifra de vídeo y -bufsize al doble de esa. El comando del paso 02 es la fila de 720p. Los planes de vídeo en directo de pago admiten hasta 5 Mbps de entrada, suficiente para la fila de 1080p.
Tres reglas que evitan la mayoría de los buffering
- Mantén los keyframes a 2 segundos fijos. Un intervalo largo o variable se nota como cortes para tus espectadores, y desde tu lado parece un fallo del servidor.
- Mantén el bitrate estable con
-maxratey-bufsize, para que una escena con mucho movimiento no pueda dispararse por encima de tu subida. - Vigila la cifra
speed=en la línea de estado de FFmpeg. Debería estar en 1x. Por debajo de eso, tu ordenador no puede codificar en tiempo real.
Deja que tu GPU haga la codificación
Si speed= baja de 1x, cambia -c:v libx264 -preset veryfast por el codificador por hardware que tenga tu ordenador. La CPU queda entonces libre para todo lo demás.
- GPU NVIDIA
-c:v h264_nvenc -preset p4- Gráficos Intel
-c:v h264_qsv- Mac
-c:v h264_videotoolbox
Ejecuta ffmpeg -encoders para ver cuáles incluye tu compilación.
Envía en su lugar un stream SRT con FFmpeg
SRT mantiene un stream estable en enlaces largos o con pérdidas, como el Wi-Fi de un evento, una subida móvil o una señal desde otro continente, donde RTMP suele cortarse. Viene con los planes Pro y Platinum de nuestra CDN de vídeo.
Tu tarjeta de streaming en directo tiene entonces una sección de ingesta SRT con tu propio puerto y frase de paso. Copia su URL de una línea y úsala como salida, con MPEG-TS en lugar de FLV. Los flags de codificación siguen igual.
Un stream SRT se reproduce con su propio nombre, así que usa el enlace de reproducción que aparece junto a él, bajo Se reproduce en.
ffmpeg -re -i input.mp4 \ [encoding] \ -f mpegts \ "srt://HOST:PORT?passphrase=PASSPHRASE&pbkeylen=16"
Tu compilación de FFmpeg necesita soporte SRT. Compruébalo con ffmpeg -protocols y busca srt en la lista de salida.
Comprueba que estás en directo y arregla lo que no
- Inicia FFmpeg y deja la ventana abierta. Una línea de estado que sigue contando
frame=ytime=significa que está enviando. - Abre la tarjeta de streaming en directo. En 15 segundos debería decir en directo y mostrar lo que tu codificador está enviando, cerca de tu bitrate.
- Copia el enlace de reproducción del mismo panel y ábrelo en VLC (Medio, Abrir stream de red) o ejecuta
ffplay "PLAYBACK_LINK". El panel también te da un código de inserción para tu propio sitio web.
| Lo que ves | Qué hacer |
|---|---|
| FFmpeg se detiene de inmediato con un error de conexión o de E/S | Comprueba el host y el nombre de la aplicación letra por letra. Algunas redes de oficina y hotel bloquean el puerto 1935: prueba con otra conexión. |
| Conecta, y luego el servidor rechaza el stream | El usuario o la contraseña son incorrectos, o la contraseña tiene un carácter que necesita codificación. Haz clic en Nueva contraseña, actualiza el comando e inténtalo de nuevo. |
speed= se mantiene muy por encima de 1x en un archivo | Olvidaste -re. Añádelo antes de -i. |
speed= se mantiene por debajo de 1x | Usa un preset más rápido (superfast), una fila más baja del paso 04 o el codificador de tu GPU. |
| FFmpeg parece ir bien pero los espectadores sufren buffering | Comprueba los flags de keyframe y luego baja el bitrate. Tu subida puede ser más lenta de lo que crees a esa hora. |
| El stream termina cuando termina el archivo | Añade -stream_loop -1 antes de -i. |
Preguntas sobre streaming con FFmpeg
¿Cómo transmito a un servidor RTMP con FFmpeg?
Codifica a H.264 y AAC, envuelve la salida en FLV con -f flv y pasa a FFmpeg la dirección RTMP como último argumento. Para un canal de Primcast, la dirección es tu servidor, aplicación y nombre de stream, con tu usuario y contraseña delante del host: rtmp://USUARIO:CONTRASEÑA@HOST:1935/APP/directo.
¿Dónde encuentro la dirección del servidor, el usuario y la contraseña?
En tu cuenta, en la tarjeta de streaming en vivo de tu cuenta de video, bajo Ajustes del codificador. La contraseña permanece oculta hasta que haces clic en Mostrar, y Nueva contraseña te da una nueva. El stream que está en vivo sigue funcionando, y la nueva contraseña se aplica a la siguiente conexión.
¿Sigo necesitando -strict experimental para el audio AAC?
No. El codificador AAC propio de FFmpeg perdió su etiqueta experimental en FFmpeg 3.0, lanzado en 2016. Un simple -c:a aac funciona en cualquier versión actual, así que puedes quitar esa opción de comandos antiguos.
¿Qué intervalo de fotogramas clave debe usar FFmpeg para streaming en vivo?
Uno fijo de 2 segundos. Cortamos los segmentos de reproducción en los fotogramas clave, así que un intervalo más largo o variable se convierte en cortes para tus espectadores. Usa -force_key_frames "expr:gte(t,n_forced*2)" con -sc_threshold 0, o -g ajustado al doble de tu tasa de fotogramas.
¿A qué bitrate debo transmitir?
Unos 2.500 kbps para 720p y 4.500 kbps para 1080p a 30 fotogramas por segundo, más 128 kbps de audio. Mantén el total en dos tercios de tu velocidad de subida medida para que un momento lento en tu línea no detenga el stream.
¿Cómo reproduzco un archivo de video en bucle todo el día con FFmpeg?
Pon -re -stream_loop -1 antes de -i y FFmpeg repetirá el archivo hasta que lo detengas. Eso mantiene un ordenador ocupado todo el día, sin embargo. Los planes de pago de CDN de video incluyen canales de estación de TV 24/7 que reproducen tus videos desde nuestro lado.
¿Puede FFmpeg codificar el stream en mi GPU?
Sí. Usa h264_nvenc en una GPU NVIDIA, h264_qsv en gráficos Intel o h264_videotoolbox en un Mac, en lugar de libx264. Las opciones de fotogramas clave y bitrate siguen igual.
¿Puedo enviar SRT en lugar de RTMP?
Sí, en los planes Pro y Platinum de CDN de video. Tu panel te da un puerto SRT y una frase de paso. Usa -f mpegts y la URL de una línea srt:// del panel como salida.
¿Prefieres una ventana a una línea de comandos?
El mismo canal funciona con cualquier codificador que hable RTMP. Estos tutoriales toman los mismos cuatro valores.
¿Necesitas un canal al que transmitir?
Abre un canal de video, pega tus valores en el comando y juzga la imagen tú mismo. ¿Atascado en una opción? Nuestro chat responde en segundos y puede mirar tu canal mientras esperas, y una persona toma el control cuando lo pidas.