我有一个Java程序,它使用帧抓取卡上的视频。这个程序是通过pythonlauncher.py
启动的。在
阅读我发现的视频流的最简单的方法是让Java在一个命名管道上读取,这非常有效。所以我的疗程是:
$ mkfifo videopipe
$ cat /dev/video1>videopipe
在第二个终端中(因为cat
命令被阻塞):
我想自动化这个过程。不幸的是,结果总是一样的:Java应用程序启动(通过Java程序中的print语句确认),但是终端停止运行,没有出现异常或其他情况。在
由于这个过程是手动的,我想我在python程序中做了一些错误的事情。为了简化操作,我隔离了管道部分:
from subprocess import call, Popen, PIPE, check_call
BASH_SWITCHTO_WINTV = ['v4l2-ctl', '-d /dev/video1', '-i 2', '--set-standard=4']
BASH_CREATE_FIFO_PIPE = ['mkfifo', 'videopipe']
BASH_PIPE_VIDEO = 'cat /dev/video1>videopipe'
def run():
try:
print('running bash commands...')
call(BASH_SWITCHTO_WINTV)
call(BASH_CREATE_FIFO_PIPE)
Popen(['cat', '/dev/video1'], stdout=open('videopipe', 'w'))
except:
raise RuntimeError('An error occured while piping the video')
if __name__ == '__main__':
run()
运行时输出:
running bash commands...
Failed to open /dev/video1: No such file or directory
如果您能提供一点帮助,我们将不胜感激
如果使用
shell=True
,只需传递一个字符串:目前,
cat
作为脚本传递给shell,/dev/video>videopipe
作为文本参数传递给该shell,而不是作为脚本文本的一部分进行解析,并且没有任何效果,因为脚本(只调用cat
)不查看其参数。在或者,为了避免不必要的shell使用(以及与shell相关的bug,例如shell shock,以及在接受来自非硬编码源的任何参数时可能发生的注入攻击):
^{pr2}$在与您的“猫到命名管道”问题无关的注释上,请确保您的空格正确无误。在
…使用名称
<space>/dev/video1
,和前导空格作为输入设备;这与在shell中运行v4l2-ctl "-d /dev/video1"
相同,这将导致相同的问题。在请确保正确地拆分了参数:
相关问题 更多 >
编程相关推荐