摄像机怎么才能低延迟的获取视屏流

1.海康摄像机参数解析

1.1 rs-232

串口通讯,RS-232是一种标准,用于串行数据通信,通常用于连接计算机和外部设备,例如摄像机。在摄像机中,RS-232端口通常用于远程控制摄像机,例如调整焦距、变焦、曝光等参数。RS-232接口通常包括发送(TX)、接收(RX)和地(GND)引脚,允许设备之间进行双向通信。

1.2 RTSP

(实时流传输协议)在底层使用TCP/IP协议栈进行通信。TCP/IP是互联网的基础协议,提供了在网络上进行数据传输和通信的基础设施。RTSP利用TCP/IP协议栈来建立连接、传输数据和控制媒体流的传输。

具体地说,RTSP通常使用TCP作为传输层协议来建立可靠的连接,并使用IP作为网络层协议来实现数据包的路由和传输。通过TCP连接,RTSP客户端和服务器之间可以进行双向通信,并且可以在连接上发送RTSP命令和控制信息,以及传输媒体数据流。

因此,要使用RTSP获取视频流,首先需要建立一个TCP连接到RTSP服务器,然后发送RTSP命令来控制媒体流的传输和获取媒体数据。通过TCP/IP协议栈,RTSP能够在网络上进行实时的音视频流传输和控制。

1.3 RTSP(加密算法)

在进行认证时,通常使用基于摘要的认证(Digest Authentication),这是一种安全的认证机制,用于验证客户端的身份而不暴露明文密码。

基于摘要的认证包括以下步骤:

  1. 客户端请求:客户端向服务器发送一个请求,请求某个资源(例如视频流)。

  2. 服务器响应要求认证:服务器收到请求后,如果资源受到保护,会返回一个状态码(通常是401 Unauthorized),告知客户端需要进行认证才能访问。

  3. 客户端发送认证信息:客户端收到服务器的认证要求后,会生成一个认证信息,其中包括用户名、密码、请求的资源、随机数(称为nonce)等,并将这些信息发送给服务器。

  4. 服务器验证认证信息:服务器收到客户端发送的认证信息后,会根据预先存储的用户凭据进行验证。验证的过程包括计算客户端发送的认证信息中的摘要,并与服务器端计算的摘要进行比较。

  5. 服务器响应认证结果:如果认证成功,服务器会返回请求的资源;否则,返回一个错误状态码。

基于摘要的认证相比基本认证(Basic Authentication)更加安全,因为它不会传输明文密码,而是通过使用随机数(nonce)和加密算法(通常是MD5)来生成摘要,并将摘要发送给服务器进行验证。

在RTSP中,基于摘要的认证通常使用Digest作为认证机制,具体的实现方式可以在RTSP的认证头中指定。

1.4 码流类型

2个视频流,一个分辨率大一个小

1.5 视频类型

通常可以指代视频流的不同形式或者数据结构。在视频传输和处理领域,常见的视频类型包括:

  1. 视频流(Video Stream):视频流是连续的视频数据流,通常是一系列的视频帧按照一定的帧率传输。视频流可以是实时的,也可以是事先录制好的。实时视频流通常用于视频监控、视频通话、实时直播等应用,而录制的视频流则可以保存为视频文件用于后续播放和处理。

  2. 复合流(Composite Stream):复合流是包含了多种不同类型数据的混合流,通常包括视频流、音频流、元数据流等。复合流可以是在视频编码过程中将不同类型数据合并为一个数据流,也可以是在传输过程中将多个数据流合并为一个流。复合流常见于视频会议、多媒体传输等场景,其中视频流用于传输图像数据,音频流用于传输声音数据,元数据流用于传输其他控制信息或附加信息。

总的来说,视频流和复合流都是视频数据的不同形式,在不同的应用场景中有着不同的用途和特点。视频流通常是处理单一的视频数据流,而复合流则可以包含多种类型的数据,用于传输多媒体内容。

1.6 码率类型

通常指的是视频编码中使用的码率控制方式,常见的包括定码率(Constant Bit Rate,CBR)和变码率(Variable Bit Rate,VBR)。

  1. 定码率(CBR):在定码率中,编码器会以固定的比特率来对视频进行编码。这意味着每秒传输的数据量是固定的,无论视频内容的复杂度如何变化,都会保持相同的码率。定码率适用于对带宽要求较为严格的场景,例如在线视频直播、视频会议等,以确保在网络带宽受限的情况下,视频的质量和稳定性。

  2. 变码率(VBR):在变码率中,编码器会根据视频内容的复杂度来动态调整输出的比特率。当视频内容复杂度低时,可以使用较低的比特率来进行编码,从而节省带宽和存储空间;而当视频内容复杂度高时,会自动调整比特率以保证视频质量。变码率适用于对带宽要求相对宽松的场景,例如视频点播、存储视频等,可以根据需要调整视频质量和带宽的平衡。

选择定码率还是变码率取决于具体的应用需求和场景。定码率可以确保视频在传输过程中稳定的带宽消耗,适用于对带宽要求严格的实时传输场景;而变码率可以根据视频内容的变化灵活调整比特率,适用于对带宽要求相对宽松的存储和点播场景。

1.7 视屏编码

它描述了视频数据的压缩方式和格式。
常见的视频编码格式包括:

  1. H.264(也称为AVC):H.264是一种广泛使用的视频编码标准,它具有高效的压缩性能和较高的视频质量,常用于视频监控、视频会议、网络视频流等领域。

  2. H.265(也称为HEVC):H.265是H.264的后继标准,它在保持较高视频质量的同时提供更高的压缩率,可以减少带宽和存储需求,因此在高清视频、4K、8K视频等领域有着广泛的应用。

  3. MPEG-4:MPEG-4是一种多媒体数据压缩标准,它包括了多种编码格式,例如MPEG-4 Part 2(也称为MPEG-4 ASP)和MPEG-4 Part 10(也称为H.264)。MPEG-4 Part 2通常用于视频存储和传输,而MPEG-4 Part 10则是H.264的另一个名称。

  4. MJPEG(Motion JPEG):MJPEG是一种简单的视频编码方式,它将视频流中的每一帧都作为JPEG图像进行独立压缩,因此不会引入帧间压缩,适用于对视频质量要求较高的应用,但会增加数据流量和存储成本。

  5. VP8、VP9:VP8和VP9是Google开发的开源视频编码格式,分别是WebM和WebRTC的标准编码格式,具有良好的压缩性能和较高的视频质量,适用于Web视频、实时通信等场景。

  6. AV1:AV1是一种由Alliance for Open Media(AOMedia)开发的开源视频编码格式,旨在提供更高的压缩性能和更好的视频质量,适用于在线视频流媒体等应用。

每种视频编码格式都有自己的特点和适用场景,选择合适的编码格式取决于应用的要求、网络带宽、设备性能和成本考虑等因素。

1.8 帧间隔

“帧间隔”通常指的是视频序列中相邻两个关键帧(I帧)之间的间隔,也称为“GOP大小”(Group of Pictures)。帧间隔决定了视频序列中关键帧的分布和视频帧的传输顺序。

在视频编码中,关键帧通常包含完整的图像信息,而非关键帧(P帧和B帧)只包含与前一帧或前后关键帧的差异信息。帧间隔的大小影响了视频压缩效率、传输带宽和解码延迟等方面。

例如,一个帧间隔为10的视频序列表示每隔10个视频帧出现一个关键帧,中间的9个帧是非关键帧,它们包含了与前一个关键帧的差异信息。较大的帧间隔可以提高视频压缩效率,减小文件大小和传输带宽,但可能会增加解码延迟和快进/快退时的加载时间。

对于实时性要求较高的应用,通常会选择较小的帧间隔,以确保视频能够快速启动和实时播放。一般情况下,较小的帧间隔可以提高视频的实时性,但可能会增加编解码负担和传输带宽需求。

2.opencv

import cv2


def process_frame(frame):
    # 显示图像
    cv2.imshow('Frame', frame)

    # 检查是否按下 'q' 键,如果是则退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        return True
    return False


# RTSP URL
rtsp_url = "rtsp://admin:av3926867@192.168.1.64/Streaming/Channels/1"

# 使用 OpenCV 直接读取 RTSP 流
cap = cv2.VideoCapture(rtsp_url)

# 设置缓冲区大小(以字节为单位)
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

# 降低分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)

try:
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        if process_frame(frame):
            break
finally:
    # 释放视频捕获对象
    cap.release()
    # 关闭窗口
    cv2.destroyAllWindows()

3.ffmpeg

首先需要安装ffmpeg
https://blog.csdn.net/nings666/article/details/134791109
然后pip install ffmpeg-python

import ffmpeg
import cv2
import numpy as np


def process_frame(frame):
    # 显示图像
    cv2.imshow('Frame', frame)

    # 检查是否按下 'q' 键,如果是则退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        return True
    return False


# RTSP URL
rtsp_url = "rtsp://admin:av3926867@192.168.1.64/Streaming/Channels/1"

# ffmpeg命令
ffmpeg_cmd = (
    ffmpeg
    .input(rtsp_url, format='rtsp', rtsp_transport='tcp', buffer_size='100000', flags='low_delay', timeout='500000')
    .output('pipe:', format='rawvideo', pix_fmt='rgb24', s='1280x720', r='15', an=None)
    .run_async(pipe_stdout=True)
)

# 读取视频帧
try:
    while True:
        # 读取一个包
        in_bytes = ffmpeg_cmd.stdout.read(1280 * 720 * 3)
        if not in_bytes:
            break
        # 将原始视频帧数据转换成图像
        frame = np.frombuffer(in_bytes, np.uint8).reshape([720, 1280, 3])
        # 处理视频帧
        if process_frame(frame):
            break
finally:
    # 关闭窗口
    cv2.destroyAllWindows()
    ffmpeg_cmd.stdout.close()
    ffmpeg_cmd.wait()

4.结论

ffmpeg比 opencv快

https://mp.weixin.qq.com/s/0C1b-8pFw0HaE1xpNbrxxw

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值