1. 安装 FFmpeg
下载 FFmpeg
并配置环境,执行 ffmpeg -version
测试安装是否成功。
2. 下载 EasyDarwin
下载后解压到本地,双击 EasyDarwin.exe
执行,打开一个 cmd
启动服务端。
浏览器搜索 http://127.0.0.1:10008/
进入网页,则安装成功。
3. 启动本地摄像头
另打开一个 cmd
,键入 ffmpeg -list_devices true -f dshow -i dummy
会打印本机的多媒体设备,找到 video
,
则左边的就是相机设备的名字,譬如这里是:USB2.0 HD UVC WebCam
;
执行 ffmpeg -f dshow -i video="{你的 video 设备名字}" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1/test
;
在推流列表中找到源地址:
4. 可视化
下载 VLC
,打开【播放】—【播放】—【网络】,粘贴地址,稍等一会儿即可。
5. Python 接收 RTSP 流
import threading
import cv2
class RTSCapture(cv2.VideoCapture):
_cur_frame = None
_reading = False
schemes = ["rtsp://", "rtmp://"]
@staticmethod
def create(url, *schemes):
rtscap = RTSCapture(url)
rtscap.frame_receiver = threading.Thread(target=rtscap.recv_frame, daemon=True)
rtscap.schemes.extend(schemes)
if isinstance(url, str) and url.startswith(tuple(rtscap.schemes)):
rtscap._reading = True
elif isinstance(url, int):
pass
return rtscap
def isStarted(self):
ok = self.isOpened()
if ok and self._reading:
ok = self.frame_receiver.is_alive()
return ok
def recv_frame(self):
while self._reading and self.isOpened():
ok, frame = self.read()
if not ok:
break
self._cur_frame = frame
self._reading = False
def read2(self):
frame = self._cur_frame
self._cur_frame = None
return frame is not None, frame
def start_read(self):
self.frame_receiver.start()
self.read_latest_frame = self.read2 if self._reading else self.read
def stop_read(self):
self._reading = False
if self.frame_receiver.is_alive():
self.frame_receiver.join()
if __name__ == "__main__":
rtscap = RTSCapture.create(url)
rtscap.start_read()
cnt = 0
while rtscap.isStarted():
ok, frame = rtscap.read_latest_frame()
if frame is not None:
cnt += 1
if cnt < 1024: # 丢弃前 1024 帧
continue
cv2.imwrite("./temp.png", frame)
rtscap.stop_read()
rtscap.release()