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),这是一种安全的认证机制,用于验证客户端的身份而不暴露明文密码。
基于摘要的认证包括以下步骤:
-
客户端请求:客户端向服务器发送一个请求,请求某个资源(例如视频流)。
-
服务器响应要求认证:服务器收到请求后,如果资源受到保护,会返回一个状态码(通常是401 Unauthorized),告知客户端需要进行认证才能访问。
-
客户端发送认证信息:客户端收到服务器的认证要求后,会生成一个认证信息,其中包括用户名、密码、请求的资源、随机数(称为nonce)等,并将这些信息发送给服务器。
-
服务器验证认证信息:服务器收到客户端发送的认证信息后,会根据预先存储的用户凭据进行验证。验证的过程包括计算客户端发送的认证信息中的摘要,并与服务器端计算的摘要进行比较。
-
服务器响应认证结果:如果认证成功,服务器会返回请求的资源;否则,返回一个错误状态码。
基于摘要的认证相比基本认证(Basic Authentication)更加安全,因为它不会传输明文密码,而是通过使用随机数(nonce)和加密算法(通常是MD5)来生成摘要,并将摘要发送给服务器进行验证。
在RTSP中,基于摘要的认证通常使用Digest
作为认证机制,具体的实现方式可以在RTSP的认证头中指定。
1.4 码流类型
2个视频流,一个分辨率大一个小
1.5 视频类型
通常可以指代视频流的不同形式或者数据结构。在视频传输和处理领域,常见的视频类型包括:
-
视频流(Video Stream):视频流是连续的视频数据流,通常是一系列的视频帧按照一定的帧率传输。视频流可以是实时的,也可以是事先录制好的。实时视频流通常用于视频监控、视频通话、实时直播等应用,而录制的视频流则可以保存为视频文件用于后续播放和处理。
-
复合流(Composite Stream):复合流是包含了多种不同类型数据的混合流,通常包括视频流、音频流、元数据流等。复合流可以是在视频编码过程中将不同类型数据合并为一个数据流,也可以是在传输过程中将多个数据流合并为一个流。复合流常见于视频会议、多媒体传输等场景,其中视频流用于传输图像数据,音频流用于传输声音数据,元数据流用于传输其他控制信息或附加信息。
总的来说,视频流和复合流都是视频数据的不同形式,在不同的应用场景中有着不同的用途和特点。视频流通常是处理单一的视频数据流,而复合流则可以包含多种类型的数据,用于传输多媒体内容。
1.6 码率类型
通常指的是视频编码中使用的码率控制方式,常见的包括定码率(Constant Bit Rate,CBR)和变码率(Variable Bit Rate,VBR)。
-
定码率(CBR):在定码率中,编码器会以固定的比特率来对视频进行编码。这意味着每秒传输的数据量是固定的,无论视频内容的复杂度如何变化,都会保持相同的码率。定码率适用于对带宽要求较为严格的场景,例如在线视频直播、视频会议等,以确保在网络带宽受限的情况下,视频的质量和稳定性。
-
变码率(VBR):在变码率中,编码器会根据视频内容的复杂度来动态调整输出的比特率。当视频内容复杂度低时,可以使用较低的比特率来进行编码,从而节省带宽和存储空间;而当视频内容复杂度高时,会自动调整比特率以保证视频质量。变码率适用于对带宽要求相对宽松的场景,例如视频点播、存储视频等,可以根据需要调整视频质量和带宽的平衡。
选择定码率还是变码率取决于具体的应用需求和场景。定码率可以确保视频在传输过程中稳定的带宽消耗,适用于对带宽要求严格的实时传输场景;而变码率可以根据视频内容的变化灵活调整比特率,适用于对带宽要求相对宽松的存储和点播场景。
1.7 视屏编码
它描述了视频数据的压缩方式和格式。
常见的视频编码格式包括:
-
H.264(也称为AVC):H.264是一种广泛使用的视频编码标准,它具有高效的压缩性能和较高的视频质量,常用于视频监控、视频会议、网络视频流等领域。
-
H.265(也称为HEVC):H.265是H.264的后继标准,它在保持较高视频质量的同时提供更高的压缩率,可以减少带宽和存储需求,因此在高清视频、4K、8K视频等领域有着广泛的应用。
-
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的另一个名称。
-
MJPEG(Motion JPEG):MJPEG是一种简单的视频编码方式,它将视频流中的每一帧都作为JPEG图像进行独立压缩,因此不会引入帧间压缩,适用于对视频质量要求较高的应用,但会增加数据流量和存储成本。
-
VP8、VP9:VP8和VP9是Google开发的开源视频编码格式,分别是WebM和WebRTC的标准编码格式,具有良好的压缩性能和较高的视频质量,适用于Web视频、实时通信等场景。
-
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