我正在尝试编程和学习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()
答案 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。在前一种情况下,首先处理网络编程概念和线程可能有点挑战。但是,它们必须使用/理解才能实现您想要的功能。