Table of Contents

Raspberry streaming bookworm

Creamos la Raspberry

sudo dd if=/home/jose/Downloads/2024-07-04-raspios-bookworm-arm64-lite.img of=/dev/mmcblk0
5537792+0 records in
5537792+0 records out
2835349504 bytes (2.8 GB, 2.6 GiB) copied, 537.586 s, 5.3 MB/s

real	8m57.656s

Habilitar SSH:

touch bootfs/ssh

Creamos usuario ruth/odin:

echo 'ruth:$6$S3pAIx36rcMzDYsK$vzl8eX.2k07Rbje9nJ4zsFQdieKw8Wg296javxQ.VW7SdknBlk03vFKh0eI8i4VGwPxWHiJCJNnCd7E72Sh8c0' > bootfs/userconf

Conectamos wifi con ip fija. El fichero se tiene que llamar con el id con la extensión nmconnection. Luego cambiar permisos a 600

sudo vim rootfs/etc/NetworkManager/system-connections/TuID.nmconnection
[connection]
id=TuID
type=wifi
autoconnect=true

[wifi]
mode=infrastructure
ssid=TuSSID

[wifi-security]
key-mgmt=wpa-psk
psk=TuContraseña

[ipv4]
method=manual
address1=192.168.1.XX/24,192.168.1.1
dns=8.8.8.8;8.8.4.4;

[ipv6]
method=ignore

Cambiamos permisos a 600

sudo chmod 600 rootfs/etc/NetworkManager/system-connections/pitufina.nmconnection

Cambiadmos SWAP a 1024

sed -i 's/^CONF_SWAPSIZE=.*/CONF_SWAPSIZE=1024/' rootfs/etc/dphys-swapfile

Configuramos Streaming

Usaremos este software
https://github.com/bluenviron/mediamtx

Bajamos el binario:
https://github.com/bluenviron/mediamtx/releases

wget https://github.com/bluenviron/mediamtx/releases/download/v1.9.3/mediamtx_v1.9.3_linux_arm64v8.tar.gz

Configuramos en el yaml:

paths:
  cam_stream:
    source: publisher

Enviamos con ffmpeg:

ffmpeg -f v4l2 -input_format yuyv422 -video_size 1280x720 -framerate 30 -i /dev/video0 -c:v libx264 -b:v 2000k -crf 18 -preset ultrafast -tune zerolatency -f rtsp rtsp://192.168.1.234:8554/cam_stream
ffmpeg -f v4l2 -probesize 10M -analyzeduration 10M -video_size 1280x720 -framerate 30 -i /dev/video0 -c:v libx264 -b:v 2000k -crf 18 -preset ultrafast -tune zerolatency -f rtsp rtsp://192.168.1.234:8554/cam_stream

RASPI 4

ffmpeg -f v4l2 -input_format yuyv422 -video_size 1280x720 -framerate 30 -i /dev/video0 -c:v h264_v4l2m2m -b:v 2000k -preset ultrafast -tune zerolatency -f rtsp rtsp://192.168.2.101:8554/cam_stream

En OBS también configuramos rtsp:

rtsp://127.0.0.1:8554/cam_stream

En mediamtx se puede ver:

2024/11/18 17:19:12 INF [RTSP] [session 1e5bc2e0] is reading from path 'cam_stream', with UDP, 1 track (H264)

PRUEBAS

Este comando funciona bien
ffmpeg -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 30 \
-i /dev/video0 -c:v libx264 -b:v 2000k -crf 18 -preset ultrafast -tune zerolatency \
-f rtsp rtsp://127.0.0.1:8554/cam_stream

rpi3 tiene muchos frames duplicados. CPU: 256% MEM: 13.1%
rpi4 no tiene frames duplicados pero pixela mucho CPU: 133% MEM: 1.5%
rpi5 igual que la rpi4 no tiene frames duplicados pero pixela mucho CPU: 84.7% MEM: 1.5%


Según chatgpt:
Cuando el q es mas alto mayor calidad, viene dado por el CRF que le ponga
frame= 8315 fps= 29 q=15.0 Lsize=N/A time=00:04:37.13 bitrate=N/A dup=6003 drop=0 speed=0.977x    

Significado de q=15.0
El valor q=15.0 indica la calidad de codificación del video en términos de QP (Quantization Parameter):

Más bajo (q=0) significa mejor calidad (más carga en el sistema).
Más alto (q=51) significa peor calidad (menos carga en el sistema).
Este valor está controlado por el CRF que configuraste (-crf 18 en tu comando). En general:

CRF 18: Calidad muy alta (visualmente indistinguible del original).
CRF 23: Calidad buena.
CRF 28+: Calidad media a baja.

HE probado con CRF a 23 y sigue perdiendo frames pero va mas fluido y calidad aceptable

Si quiero usar aceleración por hardware etngo que pasar a yuv420p y entonces me lo pixela mucho en la rpi3 aunque no pierde frames
ffmpeg se pone a 179%cpu y 11.8% mem

ffmpeg -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 30 \
-i /dev/video0 -vf format=yuv420p -c:v h264_v4l2m2m -b:v 2000k \
-f rtsp rtsp://127.0.0.1:8554/cam_stream

v4l2-ctl --list-devices
v4l2-ctl --list-formats-ext -d /dev/video0
ffmpeg -encoders | grep h264_v4l2m2m