pyav/libav/ffmpeg当来自实时源的帧处理速度不够快时会发生什么

pyav/libav/ffmpeg当来自实时源的帧处理速度不够快时会发生什么,ffmpeg,rtsp,frame-rate,libav,pyav,Ffmpeg,Rtsp,Frame Rate,Libav,Pyav,我正在使用pyav处理实时RTSP流: import av import time URL = "RTSP_url" container = av.open( url, 'r', options={ 'rtsp_transport': 'tcp', 'stimeout': '5000000', 'max_delay': '50000

我正在使用
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)
如果我
做得太慢怎么办?帧/数据包是否被丢弃或被缓冲


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

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

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

你可能不想做时间。睡眠(10)


如果您确实觉得需要丢弃数据包,那么可以在调用
decode
之前检查数据包,以查看是否落后。如果您落后得太远,您可以丢弃不是关键帧的数据包,直到赶上为止。其效果是视频会有跳跃。

您认为摄像机是否有可能根据接收器消耗的帧数计算p帧和B帧?我不确定,但我知道如果将其配置为VBR(可变比特率),一些摄像机可能会调整质量以获得更好的压缩。我不知道有哪台相机会动态修改帧速率或关键帧间隔。好的。所以基本上,对于一个未知的摄像机,如果我的代码不能足够快地处理图像,就无法提前知道会发生什么,对吗?我的意思是,
time.sleep(10)
有点夸张,但即使是一项耗时几毫秒、重复数千次的任务,也可能导致非实时处理。如果您只显示实时流,您根本不需要进行睡眠。摄像机将实时传送帧,我假设
demux
正在为您执行等待数据包。我还假设每个摄像头连接都在自己的线程上,我没有进行
睡眠
sleep
仅表示可能需要
0.2
秒(即每秒5帧)的任务。由于摄像机可能以每秒24帧的速度拍摄,我想知道24-5=19帧的延迟会发生什么。从你的回答来看,他们似乎会被缓冲,然后,一旦缓冲区满了,它将取决于相机。相机是否有可能与我同步,并通过自动删除剩余的19帧发送5帧/秒?由于缓冲区的原因,我担心我的软件会继续处理旧数据