我有一個Java程序,使用一個framegrabber卡的視頻。這個程序是通過python launcher.py
啓動的。Linux:貓到Python腳本中的命名管道
讀取我發現的視頻流的最簡單方法是讓Java在命名管道上讀取,而且這種方法非常完美。所以,我會像:
$ mkfifo videopipe
$ cat /dev/video1>videopipe
,並在第二終端(因爲cat
命令攔截):
$ python launcher.py
我想這個過程自動化。不幸的是,結果總是相同的:Java應用程序啓動(通過java程序中的打印語句確認),但終端停止,沒有任何內容出現,異常或其他。
由於這個過程手動工作,我想我在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
一點點的幫助將是非常:-)
''-d的/ dev/video1''幾乎可以肯定是一個錯誤。 ''-d','/ dev/video1'應該是兩個獨立的參數。 '-i 2'也一樣。根據所使用的解析器的不同,您可以使用不帶空格的'-d/dev/video1'或'-i2'。 –
這就是說:你當前的錯誤不是來自'cat',而是來自'v4l2-ctl'。 –
...因爲您要求它打開名爲'/dev/video1'的文件,而不是'/ dev/video1'。 –