从命名管道读取时每 M 个字节跳过 N 个字节

从命名管道读取时每 M 个字节跳过 N 个字节

我将数据从一个进程传输到另一个进程,但此流需要过滤。第一个进程是ffmpeg,第二个进程是ffplayffmpeg提供要渲染的原始视频帧fplay,但它添加了每帧 32 字节标头对于 720p 帧,这意味着每 1280x720x4 字节前面都会添加 32 个字节。

这会影响ffplay播放,我需要对这个字节流进行一些过滤,从而删除每个帧的标头。最有可能的是,应该使用od或之类的工具xxd,但我很难弄清楚具体怎么做。

答案1

Perl 来救援!

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

子串系统读取

如果您的平台上的 SSIZE_MAX 小于 1280 * 720 * 4 + 32,或者由于其他原因您无法一次读取所有字节,则可能会出现问题。也许可以尝试这个 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;
}

相关内容