如何同时分析和传输 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
我正在使用 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