Omitir N bytes cada M bytes mientras se lee de la tubería con nombre

0

Yo canalizo los datos de un proceso a otro, pero esta secuencia necesita ser filtrada. El primer proceso es ffmpeg y el segundo es ffplay. ffmpeg proporciona marco de video en bruto para fplay para renderizar, sin embargo agrega 32 bytes de encabezado a cada cuadro . Para el marco de 720p, esto significa que cada 1280x720x4 bytes se anexa con 32 bytes.

Esto afecta ffplay Reproducción y necesito tener un poco de filtrado de este flujo de bytes que caerá este encabezado para cada fotograma. Lo más probable, herramientas como od o xxd Debería utilizarse, pero tengo dificultades para averiguar cómo exactamente.

peetonn
fuente

Respuestas:

0

Perl al rescate!

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

Ver sustrato y sysread .

Puede haber un problema si SSIZE_MAX en su plataforma es inferior a 1280 * 720 * 4 + 32, o por alguna otra razón, no puede leer todos los bytes a la vez. Tal vez intente este script Perl en su lugar:

#!/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;
}
choroba
fuente
¡Gracias por la respuesta! Lo intenté, pero por alguna razón, recorta más bytes de los especificados. Por ejemplo, cuando guardo 1 fotograma de un video en un archivo después de restar 1 byte, de hecho, el archivo resultante falta 57 bytes: ffmpeg -f avfoundation -pixel_format 0rgb -framerate 25 -video_size 1280x720 -i "0" -map 0:v -c copy -f rawvideo -vframes 1 - | perl -e 'print substr $buff, 1 while sysread *STDIN, $buff, 3686432' > /tmp/frame.0rgb. Contar bytes wc -c /tmp.frame.0rgb
peetonn
Lo probé con echo {a..z} | sed 's/ //g' y sale correctamente cdefgjklmnqrstuxyz para 5 + 2. Revisa tus números.
choroba
¿Puedes probar esto? dd if=/dev/urandom bs=3686432 count=1 > /tmp/random lo que da 3686432 bytes aleatorios ( wc -c /tmp/random ) y entonces cat /tmp/random | perl -e 'print substr $buff, 32 while sysread *STDIN, $buff, 3686432' > /tmp/truncated - Se espera que dé 3686400 pero no lo es - da 3684256 bytes en su lugar ( wc -c /tmp/truncated ).
peetonn
@peeton: Funciona para mí. ¿Qué versión de perl tienes?
choroba
extraño: This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level (with 2 registered patches, see perl -V for more detail)
peetonn