0

pyav用来处理实时 RTSP 流:

import av
import time

URL = "RTSP_url"
container = av.open(
            url, 'r',
            options={
                'rtsp_transport': 'tcp',
                'stimeout': '5000000',
                'max_delay': '5000000',
            }
        )

for packet in self.container.demux(video=0):
    for frame in packet.decode():
        # do something
        time.sleep(10)

如果我do something太慢了怎么办?帧/数据包是否被丢弃或被缓冲?

我想同样的问题也适用于libavor ffmpeg

4

2 回答 2

1

tcp是具有内置流量控制的保证交付协议。如果您没有像接收到的那样快速处理传入的数据,则tcp堆栈将缓冲数据,直到其缓冲区已满,此时tcp协议将让发送方知道它无法接收更多数据。如果这种情况继续下去,发送方的输出缓冲区最终将被填满,然后由发送方决定要做什么。

此时的 IP 摄像机可能会丢弃帧,甚至可能会断开连接。大多数 IP 摄像机还使用通常通过通过 RTSP 流发送的 RTCP 数据包的保活机制。相机可能会发送发送方报告,而接收方应发送回接收方报告。如果相机在超时内没有收到接收器报告,它将断开连接。我不得不假设av图书馆或ffmpeg正在这样做。

你可能不想做time.sleep(10)

如果你真的觉得你需要丢弃数据包,那么你可以在打电话之前检查你的数据包decode,看看你是否落后了。如果你落后太远,你可以丢弃不是关键帧的数据包,直到你赶上。效果将是视频将在其中跳转。

于 2021-05-19T20:42:05.763 回答
1

根据我的经验,gstreamer 可以将旧帧存储在缓冲区中,甚至在几分钟后返回它们。不确定 PyAv 是否会这样做。

于 2021-10-29T22:45:06.517 回答