如何同时分析和传输 RaspberryPi 视频

How to simultaneously analyse and stream RaspberryPi video

我正在使用 raspivid 和 netcat 将视频从 RaspberryPi Zero 流式传输到我的 PC:

raspivid -t 0 -n -w 320 -h 240 -hf -fps 30 -o - | nc PC_IP PORT

现在我想在RaspberryPi上逐帧分析这个视频来做物体检测。 Raspi 必须对物体检测做出反应,所以我必须在播放视频时对 Pi 进行分析。

我的想法是用 tee 命令创建一个命名管道并在 python 程序中读取这个命名管道以获取帧:

mkfifo streampipe    
raspivid -t 0 -n -w 320 -h 240 -hf -fps 30-o - | tee nc PC_IP PORT | streampipe

但这不起作用,它说 sh1: 1: streampipe: not found

我的 python 程序如下所示:

import subprocess as sp
import numpy

FFMPEG_BIN = "ffmpeg"
command = [ FFMPEG_BIN,
        '-i', 'streampipe',       # streampipe is the named pipe
        '-pix_fmt', 'bgr24',      
        '-vcodec', 'rawvideo',
        '-an','-sn',              # we want to disable audio processing (there is no audio)
        '-f', 'image2pipe', '-']    
pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=10**8)

while True:
    # Capture frame-by-frame
    raw_image = pipe.stdout.read(640*480*3)
    # transform the byte read into a numpy array
    image =  numpy.fromstring(raw_image, dtype='uint8')
    image = image.reshape((480,640,3))          # Notice how height is specified first and then width
    if image is not None:

        analyse(image)...

    pipe.stdout.flush()

有没有人知道如何做到这一点?

感谢您的回答。

tee 命令将 stdin 复制到 stdout,并在此过程中复制到您提到的任何其他文件:

ProcessThatWriteSTDOUT | tee SOMEFILE | ProcessThatReadsSTDIN

或复印两份:

ProcessThatWriteSTDOUT | tee FILE1 FILE2 | ProcessThatReadsSTDIN

您的 nectcat 命令不是文件,而是一个进程。所以你需要让你的过程看起来像一个文件 - 那就是所谓的 "process substitution" 你这样做是这样的:

ProcessThatWriteSTDOUT | tee >(SomeProcess) | ProcessThatReadsSTDIN

所以,要剪长篇故事,您需要更多类似的东西:

raspivid ... -fps 30-o - | tee >(nc PC_IP PORT) | streampipe