首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyav / libav / ffmpeg当来自实时源代码的帧处理速度不够快时会发生什么

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

Stack Overflow用户
提问于 2021-05-19 05:33:07
回答 2查看 109关注 0票数 0

我正在使用pyav处理实时RTSP流:

代码语言:javascript
复制
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太慢了会发生什么?帧/数据包是被丢弃还是被缓冲?

我猜同样的问题也适用于libavffmpeg

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-29 22:45:07

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

票数 1
EN

Stack Overflow用户

发布于 2021-05-20 04:42:06

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

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

您可能不想执行time.sleep(10)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67594208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档