Streaming experiment


Local streaming with ffmpeg:


The source of streaming

#Ordinary command
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -tune zerolatency -f mpegts udp://127.0.0.1:5000

#To forze the sending of SPS/PPS parameters
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -x264opts "repeat-headers=1:keyint=25" -tune zerolatency -f mpegts udp://127.0.0.1:5000


parameter meaning
-f v4l2 Especifica el formato de entrada, que en este caso es un dispositivo V4L2 (una webcam en Linux).
-i /dev/video0: Define la entrada, que es tu dispositivo de webcam.
-c:v libx264 Elige el códec de video H.264 para la compresión. -tune zerolatency optimiza la compresión para reducir la latencia, algo clave para transmisiones en tiempo real.
-f mpegts: Empaqueta el video en un formato de Transport Stream, que es ideal para transmisiones.
-x264opts "repeat-headers=1:keyint=25" Esta es la opción clave. Le dice al codificador H.264 (libx264) que repita los encabezados SPS (Sequence Parameter Set) y PPS (Picture Parameter Set) en cada fotograma clave (I-frame). Esto asegura que el receptor siempre tenga los parámetros de configuración necesarios, incluso si se pierde el inicio del flujo.

x264opts "keyint=25": Esta opción establece el intervalo entre fotogramas clave. Un valor de 25 significa que se insertará un fotograma clave cada 25 fotogramas. Combinado con repeat-headers=1, esto asegura que los parámetros SPS/PPS se envíen cada segundo (si la tasa de fotogramas es de 25 fps).
udp://127.0.0.1:5000 Esta es la dirección y el puerto de destino. Le dice a FFmpeg que envíe el flujo de datos a través de UDP al puerto 5000 en la misma máquina (localhost).


GNU-radio experiment



UDP source
Input type byte
port 5000
Header None
UDP Packet Data Size 188
Notify Missed FRames No
SRC 0s if No Data No
Enable IPv6 Support No
Vector length 1
UDP sink
Input type byte
Address 127.0.0.1
Destination port 2000
Header None
UDP Packet Data Size 188
Send Null packet as EOF No
Vector length 1


Streaming destination

The destination must execute the following command:

#Command for matroska container: doesn't works
#Due the system can't detect the starting point of the video
ffmpeg -probesize 32 -analyzeduration 0 -f mpegts -pkt_size 188 -i udp://127.0.0.1:2000 -an -c:v copy -f matroska - | ffplay -

#Command for matroska container: it works
ffmpeg -probesize 1000000 -analyzeduration 10000000 -f mpegts -pkt_size 188 -i udp://127.0.0.1:2000 -an -c:v copy -f matroska - | ffplay -

#Commands for mp4 container
ffmpeg -probesize 1000000 -analyzeduration 10000000 -f mpegts -pkt_size 188 -i udp://127.0.0.1:2000 -an -c:v copy -f mp4 - | ffplay -


Parameter Meaning
-probesize 1000000
-pkt_size 188 El formato Transport Stream (TS), que estás usando para empaquetar el video, está compuesto por paquetes de datos de tamaño fijo. Normalmente, este tamaño es de 188 bytes o 204 bytes.
-f matroska En el comando de FFmpeg significa que el programa debe usar el formato de contenedor Matroska para el flujo de salida. Es una parte crucial del comando que le dice a FFmpeg cómo "empaquetar" los datos de video que está recibiendo.


Other containers

pseudocode Meaning
MP4 (.mp4) Uno de los más populares. Es muy compatible con casi todos los dispositivos y plataformas, ideal para streaming web, móviles y redes sociales. Es el contenedor estándar para los códecs de video H.264 y H.265.
MOV (.mov) El formato de Apple QuickTime. Aunque fue desarrollado por Apple, es compatible con muchos otros sistemas.
AVI (.avi) Un formato antiguo de Microsoft. Es muy versátil, pero no tiene soporte nativo para funciones modernas como el streaming o los subtítulos avanzados.
WebM (.webm) Un formato de código abierto desarrollado por Google. Está diseñado para ser usado en la web con códecs de video como VP9 y AV1.
MPEG-TS (.ts) Es el Transport Stream, un contenedor optimizado para transmisiones de video en vivo y televisión digital (como DVB-T y ATSC). Es robusto contra la pérdida de datos, lo que lo hace ideal para la transmisión de señales de radiofrecuencia (RF).


Detected errors

The message error:


[h264 @ 0x5d7ec37f8780] no frame!
[h264 @ 0x5d7ec37f8780] non-existing PPS 0 referenced    0B f=0/0



What is the meaning of those messages?

Cuando FFmpeg no encuentra estos parámetros al principio de la transmisión, no puede decodificar las tramas de video, lo que causa el retraso inicial. Esto es porque el códec H.264 no puede interpretar las tramas de video sin estos parámetros.

Lo más probable es que GStreamer o FFmpeg, al ser la fuente de video, envían los datos SPS y PPS una sola vez al inicio. Si tu diagrama de GNU Radio pierde esos paquetes o no los recibe de inmediato, el receptor (FFmpeg) no puede comenzar la decodificación hasta que los reciba o hasta que los datos de la transmisión los envíen nuevamente.

El retraso inicial se debe a que FFmpeg está esperando y analizando el flujo de datos para encontrar esos parámetros esenciales. Una vez que los encuentra, la decodificación y la reproducción comienzan.