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

标签 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': '5000000',
            }
        )

for packet in self.container.demux(video=0):
    for frame in packet.decode():
        # do something
        time.sleep(10)
如果我 do something 会发生什么?太慢了?帧/数据包是否被丢弃或被缓冲?
我想同样的问题也适用于 libavffmpeg .

最佳答案

tcp是具有内置流量控制的保证交付协议(protocol)。如果您处理传入数据的速度不如接收到的速度,tcp堆栈将缓冲数据,直到其缓冲区已满,此时 tcp协议(protocol)将让发送者知道它无法接收更多数据。如果这种情况继续下去,发送方的输出缓冲区最终将被填满,然后由发送方决定要做什么。
此时的 IP 摄像机可能会丢弃帧,甚至可能会断开连接。大多数 IP 摄像机还使用通常通过通过 RTSP 流发送的 RTCP 数据包的保活机制。相机可能会发送发送方报告,而接收方应发送回接收方报告。如果相机在超时内没有收到接收器报告,它将断开连接。我不得不假设 av图书馆或 ffmpeg正在这样做。
你可能不想做time.sleep(10) .
如果你真的觉得你需要丢弃数据包,那么你可以在调用 decode 之前检查你的数据包。看看你是否落后。如果你落后太远,你可以丢弃不是关键帧的数据包,直到你 catch 。效果将是视频将在其中跳转。

关于ffmpeg - pyav/libav/ffmpeg 当来自实时源的帧处理速度不够快时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67594208/

相关文章:

ffmpeg - 使用 ffmpeg 在 JPG 上覆盖透明 mov 文件

html - m3u8 文件可以有 mp4 文件 url 吗?

android - 通过 RTSP 流式传输视频

linux - 如何让低帧率视频看起来更流畅?

video - 如何插入帧以补偿捕获期间丢失的帧

audio - 如何在保持音频格式 PCM = 1(线性量化)的同时将 24 位 WAV 文件转换为 32 位

python-3.x - ffmpeg-python 包装器 ffmpeg.run() 获取 FILENOTFOUNDERROR

iphone - RTSPPlay 不运行

android - 无法在android中使用videoview播放rtsp

OpenGL 帧率