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 · rtmp
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.

01

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.

instalar
# 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.

02

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.

dirección rtmp
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.

Qué hace cada opción de FFmpeg en el comando
OpciónQué hace
-reLee 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.mp4Tu entrada: un archivo, un dispositivo u otro stream. El paso 03 tiene una para cada caso.
-c:v libx264Codifica el vídeo como H.264, que cualquier reproductor y navegador puede mostrar.
-preset veryfastCambia 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 5000kMantiene 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 yuv420pEl 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 0Evita 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 2Audio estéreo AAC a 128 kbps y 44,1 kHz. El codificador AAC integrado de FFmpeg no necesita ninguna opción adicional.
-f flvEnvuelve 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.

03

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.

archivo
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.

windows · dshow
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.

macos · avfoundation
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.

linux · v4l2
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.

windows · gdigrab
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.

cámara rtsp
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.

04

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.

Bitrates de vídeo y audio FFmpeg sugeridos por resolución
ImagenAñadir al comandoVídeoAudioSubida necesaria
1080p, 30 fps-vf scale=-2:1080 -r 304500k128k7 Mbps
720p, 30 fps-vf scale=-2:720 -r 302500k128k4 Mbps
480p, 30 fps-vf scale=-2:480 -r 301200k96k2 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

  1. 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.
  2. Mantén el bitrate estable con -maxrate y -bufsize, para que una escena con mucho movimiento no pueda dispararse por encima de tu subida.
  3. 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.

05

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 · srt
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.

06

Comprueba que estás en directo y arregla lo que no

  1. Inicia FFmpeg y deja la ventana abierta. Una línea de estado que sigue contando frame= y time= significa que está enviando.
  2. 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.
  3. 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.
Problemas comunes de streaming con FFmpeg y sus soluciones
Lo que vesQué hacer
FFmpeg se detiene de inmediato con un error de conexión o de E/SComprueba 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 streamEl 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 archivoOlvidaste -re. Añádelo antes de -i.
speed= se mantiene por debajo de 1xUsa 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 bufferingComprueba 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 archivoAñade -stream_loop -1 antes de -i.
07

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.

08

¿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.