我正在使用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太慢了会发生什么?帧/数据包是被丢弃还是被缓冲?
我猜同样的问题也适用于libav或ffmpeg。
发布于 2021-10-29 22:45:07
根据我的经验,gstreamer可以将旧帧存储在缓冲区中,并在几分钟后将其返回。不确定PyAv是否也会这么做。
发布于 2021-05-20 04:42:06
tcp是一种内置流量控制的有保证的传输协议。如果处理传入数据的速度不如收到数据时快,则tcp堆栈将对数据进行缓冲,直到其缓冲区已满为止,此时tcp协议将让发送方知道它无法再接收任何数据。如果这种情况持续下去,发送者的输出缓冲区最终将被填满,然后由发送者决定做什么。
此时,IP摄像机可能会丢弃帧,甚至可能会断开连接。大多数IP摄像机还使用保活机制,通常是通过RTSP流上发送的RTCP数据包。摄像机可以发送发送方报告,而接收方应发回接收方报告。如果摄像机在超时时间内没有收到接收器报告,它将断开连接。我必须假设av库或ffmpeg正在做这件事。
您可能不想执行time.sleep(10)。
如果您确实觉得需要丢弃数据包,那么可以在调用decode之前检查您的数据包,看看是否落后了。如果您落后太多,您可以丢弃不是关键帧的数据包,直到您赶上。其效果将是视频中将有跳转。
https://stackoverflow.com/questions/67594208
复制相似问题