断开连接后,在python中重新连接到PiCamera流

时间:2017-10-31 17:30:39

标签: python loops sockets raspberry-pi reconnect

我正在尝试编程和学习python,同时使用raspberry pi来创建一个项目。到目前为止,我只是想让它开始使用python中的picamera录制视频,以及流式播放该视频,以便我可以监控手机上的输出。然而,就目前看来,它只在我通过某种流媒体程序连接到它时才开始录制视频。我想要它做的是在程序开始时开始录制视频,并且只要我想监视它就可以连接到它。目前我可以连接到它没问题,但后来我无法重新连接它。

我想要的基本想法有点像这样。

Start Recording
Listen on port 8080
    if connection is started
       start streaming video stream 2 (also known as splitter port)
    else connection ended
       wait for new connection

我意识到这听起来很糟糕。我希望它能给出我想要做的一般概念。就像我说我只是学习python,并且只有Basic的一些基础知识。

这是我正在使用的代码。就像我说的那样,只有当我连接它时它才有效。

#!/usr/bin/python

import socket
import picamera
import datetime as dt
import os.path

filename = 'hauntvideo'
save_path = '/home/pi'
completed_video = os.path.join(save_path, filename)

import warnings
warnings.filterwarnings('error', category=DeprecationWarning)

#Camera Setup
with picamera.PiCamera() as camera:
    camera.resolution = (1920, 1080)
    camera.framerate = 30
    camera.hflip = True
    camera.vflip = True
#Connection Listening
    server_socket = socket.socket()
    server_socket.bind(('0.0.0.0', 8080))
    server_socket.listen(5)

    connection = server_socket.accept()[0].makefile('wb')

    try:
        camera.start_recording(connection, format='h264', splitter_port=2, 
resize=(640,360))
        camera.start_recording(completed_video + '{}.h264'.format( 
dt.datetime.now().strftime('%Y%m%d%H%M%S') ), bitrate=4500000)
        camera.wait_recording(7*60*60)
        camera.stop_recording()
    finally:
        connection.close()
        server_socket.close()
        quit()

1 个答案:

答案 0 :(得分:0)

  

然而,目前它只是在我通过某种流媒体程序连接到它时才开始录制视频。我想要它做的是在程序开始时开始录制视频,并且只要我想监视它就可以连接到它。

这是由于以下代码行:

connection = server_socket.accept()[0].makefile('wb')

accept()函数阻塞,这意味着它在建立连接之前不会返回。因此,开始录制的代码:

camera.start_recording(connection, format='h264', ... )

仅在建立连接后(在accept()返回之后)执行。

为了达到你想要的效果,你需要使用线程。在一个帖子中,开始在本地录制视频,即

camera.start_recording(completed_video + '{}.h264'.format( 
dt.datetime.now().strftime('%Y%m%d%H%M%S') ), bitrate=4500000)

在另一个线程中,接受传入连接,并在连接呼叫时:

camera.start_recording(connection, format='h264', splitter_port=2, 
resize=(640,360))
  

目前我可以连接到它没问题,但后来我无法重新连接它。

如果您希望能够无限期地连接,断开连接和重新连接,那么您需要在循环中接受连接(在其自己的线程中)。也许是这样的:

while(True):
    connection = server_socket.accept()[0].makefile('wb')
    camera.start_recording(connection, format='h264', splitter_port=2, 
    resize=(640,360))
    camera.wait_recording(7*60*60) #assuming this records for 7 hours?
  

我正在尝试编程和学习python,同时使用raspberry pi来创建一个项目。

我不知道你是不是一般的编程新手,或者只是python。在前一种情况下,首先处理网络编程概念和线程可能有点挑战。但是,它们必须使用/理解才能实现您想要的功能。