这里有另一种选项。
它比其他答案更加复杂。但是,通过仅连接到相机,您可以将同一流同时分叉到多个多进程、屏幕、重新转换为多播、写入磁盘等。当然,只有在需要这样做的情况下(否则您会选择早期的答案)。
让我们创建两个独立的Python程序:
1. 服务器程序(rtsp连接,解码)server.py
2. 客户端程序(从共享内存读取帧)client.py
必须先启动服务器,然后再启动客户端。
python3 server.py
然后在另一个终端中:
python3 client.py
这里是代码:
(1) server.py
import time
from valkka.core import *
image_interval=1000
width =1920//4
height =1080//4
shmem_name ="cam_example"
shmem_buffers =10
shmem_filter =RGBShmemFrameFilter(shmem_name, shmem_buffers, width, height)
sws_filter =SwScaleFrameFilter("sws_filter", width, height, shmem_filter)
interval_filter =TimeIntervalFrameFilter("interval_filter", image_interval, sws_filter)
avthread =AVThread("avthread",interval_filter)
av_in_filter =avthread.getFrameFilter()
livethread =LiveThread("livethread")
ctx =LiveConnectionContext(LiveConnectionType_rtsp, "rtsp://user:password@192.168.x.x", 1, av_in_filter)
avthread.startCall()
livethread.startCall()
avthread.decodingOnCall()
livethread.registerStreamCall(ctx)
livethread.playStreamCall(ctx)
time.sleep(20)
livethread.stopCall()
avthread.stopCall()
print("bye")
(2)
client.py
import cv2
from valkka.api2 import ShmemRGBClient
width =1920//4
height =1080//4
shmem_name ="cam_example"
shmem_buffers =10
client=ShmemRGBClient(
name =shmem_name,
n_ringbuffer =shmem_buffers,
width =width,
height =height,
mstimeout =1000,
verbose =False
)
while True:
index, isize = client.pull()
if (index==None):
print("timeout")
else:
data =client.shmem_list[index][0:isize]
img =data.reshape((height,width,3))
img =cv2.GaussianBlur(img, (21, 21), 0)
cv2.imshow("valkka_opencv_demo",img)
cv2.waitKey(1)
如果您感兴趣,请查看https://elsampsa.github.io/valkka-examples/了解更多信息。