跳转至

获取本体相机视频流

1. 视频流地址

1
rtsp://192.168.133.1:8554/test
IP地址需根据实际连接情况修改。

2. 通过ffmpeg获取视频流

在安装了ffmpeg的设备上执行以下命令可直接获取本体相机的视频流

1
2
ffplay -rtsp_transport tcp -fflags nobuffer -flags low_delay -framedrop -strict \
experimental -probesize 32 -analyzeduration 0 -sync ext rtsp://192.168.234.1:8554/test

3. 通过GStreamer获取视频流

安装GStreamer后安装以下插件

1
2
3
4
5
6
sudo apt install -y gstreamer1.0-tools \
                    gstreamer1.0-plugins-base \
                    gstreamer1.0-plugins-good \
                    gstreamer1.0-plugins-bad \
                    gstreamer1.0-plugins-ugly \
                    gstreamer1.0-libav

  • gstreamer1.0-tools:包含 gst-launch-1.0 等核心工具
  • gstreamer1.0-plugins-base:基础插件(如 autovideosink)
  • gstreamer1.0-plugins-good:常用插件(如 rtph264depay)
  • gstreamer1.0-plugins-bad:实验性插件(如 rtspsrc)
  • gstreamer1.0-plugins-ugly:特殊编码器(如 mpeg)
  • gstreamer1.0-libav:FFmpeg 相关插件。

插件安装后执行以下命令获取本体相机的视频流

1
2
gst-launch-1.0 rtspsrc location=rtsp://192.168.234.1:8554/test latency=0 ! rtph264depay \
! h264parse ! avdec_h264 ! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! autovideosink

4. 通过VLC获取视频流

在最新版本3.0.21的VLC中,右键点击播放列表,选择“添加网络流”,输入视频流地址,点击“播放”即可。 但部分设备安装3.0.21版本后无法正常打开,建议使用GStreamer获取视频流。

5. 通过OpenCV获取视频流

安装OpenCV后,执行以下代码获取本体相机的视频流

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import cv2
import time

def read_rtsp_Stream(rtsp_url):
    # 1. 初始化视频捕获,强制使用TCP
    cap = cv2.VideoCapture(rtsp_url + "?tcp")  # 尝试TCP传输

    # 2. 降低缓冲区大小
    if hasattr(cv2, 'CAP_PROP_BUFFERSIZE'):
        cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)  # 缓冲区只保留1帧

    # 3. 禁用硬件加速
    if hasattr(cv2, 'CAP_PROP_HW_ACCELERATION'):
        cap.set(cv2.CAP_PROP_HW_ACCELERATION, cv2.VIDEO_ACCELERATION_NONE)

    if not cap.isOpened():
        print(f"无法打开流: {rtsp_url}")
        # 若TCP失败,尝试默认协议
        cap = cv2.VideoCapture(rtsp_url)
        if not cap.isOpened():
            print("所有协议均无法打开流,退出")
            return

    # 4. 循环读取,只取最新帧(跳过旧帧)
    while True:
        # 连续读取多次,丢弃中间帧,只保留最后一帧(最新帧)
        # 这一步可解决缓冲区累积的旧帧问题
        for _ in range(3):  # 尝试读取3次,确保拿到最新帧
            ret, frame = cap.read()
            if not ret:
                break

        if not ret:
            print("流中断,尝试重连...")
            time.sleep(1)
            cap = cv2.VideoCapture(rtsp_url + "?tcp")
            if hasattr(cv2, 'CAP_PROP_BUFFERSIZE'):
                cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
            continue

        # 5. 缩小分辨率(可选,降低显示和传输压力)
        frame = cv2.resize(frame, (1280, 720))  # 根据需求调整

        # 显示帧
        cv2.imshow("RTSP Stream (按q退出)", frame)

        # 检测退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    rtsp_url = "rtsp://192.168.234.1:8554/test" 
    read_rtsp_Stream(rtsp_url)

6. 通过OpenCV使用GStreamer获取视频流

安装OpenCV和GStreamer后,执行以下代码获取本体相机的视频流

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import cv2
import time

def read_rtsp_gstreamer(rtsp_url):  
    # 构建GStreamer管道
    pipeline = (
        f'rtspsrc location={rtsp_url} latency=0 ! '
        'rtph264depay ! avdec_h264 ! '
        'videoconvert ! video/x-raw,format=BGR ! '
        'appsink sync=false drop=true max-buffers=1'
    )

    # 创建GStreamer捕获对象
    cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)

    if not cap.isOpened():
        print("无法打开GStreamer管道")
        return

    try:
        while True:
            ret, frame = cap.read()
            if not ret:
                print("读取帧失败")
                break

            # 显示帧
            cv2.imshow("GStreamer Low Latency", frame)

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

    finally:
        cap.release()
        cv2.destroyAllWindows()
if __name__ == "__main__":
    rtsp_url = "rtsp://192.168.234.1:8554/test"
    read_rtsp_gstreamer(rtsp_url)

7. 优化视频流延迟

直接获取视频流进行展示,可能存在画面延迟问题,这种情况需要优化视频流获取参数,如调整缓冲区大小、禁用硬件加速等。
在设备屏幕遥控器上获取同样的视频流,展示的视频流效果已经做到较低的延迟。
使用上方的GStreamer获取视频流,也有较低的延迟,这并非是机器端推送的视频流存在延迟。
也可以选择如大牛直播SDK等针对性做过优化的程序进行播放。