Tenho um programa de captura de câmera e um programa de streaming de vídeo trabalhando juntos como rpicam-vid ... | go2rtc
. Meu problema é que ele go2rtc
só lê dados do pipe quando alguém abre o stream de vídeo, mas preciso rpicam-vid
executar continuamente mesmo quando o stream não está ativo. Existe uma maneira de simplesmente descartar dados quando o leitor não está puxando dados?
Você pode inserir algo entre
ripcam-vid
andgo2rtc
que encaminhe os dados com a saída no modo não bloqueante para que, quando o pipe estiver cheio porque nada está sendo lido, os dados sejam descartados (owrite()
s para o pipe simplesmente falha comEAGAIN
( Resource temporary unavailable )¹):Aqui, usando
dd
(supõe-se que seja a implementação GNU dedd
) para alterar o stdout para o modo não bloqueante eperl
encaminhar os dados em blocos de até 8 KiB.Por padrão no Linux, o tamanho do buffer de pipe é 64KiB, você pode aumentá-lo para tornar menos provável que os dados sejam descartados em operação normal usando o
F_SETPIPE_SZ
fnctl. Por exemplo, fazendo o aumento da capacidade do non-block e do pipe comperl
:O valor máximo do tamanho do tubo que pode ser usado é determinado por
/proc/sys/fs/pipe-max-size
(sysctl fs/pipe-max-size
), 1 MiB por padrão, que você pode aumentar conformeroot
necessáriosysctl -w fs/pipe-max-size="$newvalue"
.Mas não tenho certeza se descartar trechos de um vídeo como esse é uma boa ideia.
¹ O modo não bloqueante também pode significar gravações curtas, ou seja, ao gravar em um pipe que está quase cheio, apenas o que pode caber no pipe pode ser gravado, o restante é descartado se não for tentado novamente.