Pula N bytes a cada M bytes durante a leitura do named pipe

0

Eu canalizo dados de um processo para outro, mas esse fluxo precisa ser filtrado. O primeiro processo é ffmpeg e o segundo é ffplay . ffmpeg fornece frame de vídeo bruto para fplay para renderizar, no entanto, adiciona cabeçalho de 32 bytes para cada quadro . Para quadros de 720p, isso significa que todos os bytes de 1280x720x4 são prefixados com 32 bytes.

Isso afeta a reprodução de ffplay e eu preciso ter alguma filtragem desse fluxo de bytes, que irá soltar este cabeçalho para cada quadro. Provavelmente, ferramentas como od ou xxd devem ser usadas, mas tenho dificuldades em descobrir exatamente como.

    
por peetonn 20.09.2018 / 15:33

1 resposta

0

Perl para o resgate!

perl -e 'print substr $buff, 32 while sysread *STDIN, $buff, 1280 * 720 * 4 + 32'

Veja substr e sysread .

Pode haver um problema se o SSIZE_MAX na sua plataforma for menor que 1280 * 720 * 4 + 32 ou, por algum outro motivo, você não conseguir ler todos os bytes de uma só vez. Talvez tente este script em Perl:

#!/usr/bin/perl
use warnings;
use strict;

my ($BLOCK_SIZE, $HEADER_SIZE) = (3686400, 32);

while (1) {
    my $block_size = 0;
    my $block = "";
    my $buff_size;
    while (1) {
        $buff_size = sysread *STDIN, my $buff,
                             $HEADER_SIZE + $BLOCK_SIZE - $block_size;
        last unless $buff_size;

        $block .= $buff;
        $block_size += $buff_size;
    }
    last unless $block_size;

    substr $block, 0, $HEADER_SIZE, "";
    print $block;
}
    
por 20.09.2018 / 15:52