微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在使用 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 太慢会怎样?帧/数据包是否被丢弃或被缓冲?

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

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。