FFmpeg报错:Connection to tcp://XXX?timeout=XXX failed: Connection timed out

news2025/1/24 22:52:06

一、现象

通过FFmpeg(FFmpeg的版本是5.0.3)拉摄像机的rtsp流获取音视频数据,执行命令:

./ffmpeg -timeout 3000000 -i "rtsp://172.16.17.156/stream/video5"

报错:Connection to tcp://XXX?timeout=XXX failed: Connection timed out。

二、Wireshark抓包分析

执行FFmpeg命令的本机ip为192.168.16.13,摄像机的ip为172.16.17.156。通过Wireshark抓包可以发现,执行上述命令时,TCP三次握手失败,出现“TCP Retransmission”:

这意味着TCP重传了。图中的“TCP Retransmission”是重传标记,No2到No6的包是重传包,也就是TCP客户端(执行FFmpeg命令的本机)的SYN发出去之后没有收到摄像机的syn ack,TCP客户端持续发syn,重传5次之后就停止了。所以这可能就意味着摄像机掉线/本机访问摄像机不正常/防火墙iptables规则存在问题,我们得要进行一下网络检查。

三、FFmpeg源码分析

调试FFmpeg源码,可以看到

“Connection to tcp://XXX?timeout=XXX failed: Connection timed out”这个错误

是由源文件libavformat/network.c中的函数ff_connect_parallel 中的

av_log(h, AV_LOG_ERROR, "Connection to %s failed: %s\n",h->filename, errbuf);

这一行打印出来的,此时变量last_err的值为-110。

整个程序的调用堆栈为:avformat_open_input

->  if ((ret = s->iformat->read_header(s)) < 0)      [实际执行rtsp_read_header]

-> ret = ff_rtsp_connect(s);

->  if ((ret = ffurl_open_whitelist(&rt->rtsp_hd, tcpname, AVIO_FLAG_READ_WRITE,

&s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist, NULL)) < 0)

-> ret = ffurl_connect(*puc, options);

-> uc->prot->url_open(uc, uc->filename, uc->flags);      [实际执行tcp_open]

-> ret = ff_connect_parallel(ai, s->open_timeout / 1000, 3, h, &fd, customize_fd, s);
 

-> av_log(h, AV_LOG_ERROR, "Connection to %s failed: %s\n", h->filename, errbuf);

所以为什么会执行av_log(h, AV_LOG_ERROR, "Connection to %s failed: %s\n", h->filename, errbuf)这条语句呢,是因为last_err的值为-110。而last_err是在执行了函数ff_poll_interrupt后才变为-110的。

我们 看一下函数ff_poll_interrupt 的源码:

static int ff_poll_interrupt(struct pollfd *p, nfds_t nfds, int timeout,
                             AVIOInterruptCB *cb)
{
    int runs = timeout / POLLING_TIME;
    int ret = 0;

    do {
        if (ff_check_interrupt(cb))
            return AVERROR_EXIT;
        ret = poll(p, nfds, POLLING_TIME);
        if (ret != 0) {
            if (ret < 0)
                ret = ff_neterrno();
            if (ret == AVERROR(EINTR))
                continue;
            break;
        }
    } while (timeout <= 0 || runs-- > 0);

    if (!ret)
        return AVERROR(ETIMEDOUT);
    return ret;
}

可以看出来,FFmpeg拉流时会执行poll函数(没错,就是跟I/O复用select、epoll 并列的poll函数),当poll函数返回0时,代表没有任何socket描述符准备好读、写,或出错,此时poll超时,超时时间是POLLING_TIME(默认100)毫秒,然后该逻辑执行timeout / POLLING_TIME次后,函数ff_poll_interrupt会返回AVERROR(ETIMEDOUT),也就是返回-110。

四、总结

FFmpeg拉流时会执行poll函数,poll函数超时时会返回0,然后FFmpeg的ff_poll_interrupt函数会返回-110,然后打印错误:Connection to tcp://XXX?timeout=XXX failed: Connection timed out

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/965525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 生成 16: 9 宽高比

这篇文章只是对 for 循环一个简单应用&#xff0c;没有什么知识含量。 可以跳过这篇文章。 只是我用来保存一下我的代码&#xff0c;保存在本地我嫌碍眼&#xff0c;总想把他删了。 正文部分 公式&#xff1a;其中 width 表示宽度&#xff0c;height 表示高度 16 9 w i d t…

CLIP改进工作串讲(bryanyzhu)内容记录

文章目录 分割Language-driven semantic segmentation - ICLR2022GroupViT: Semantic Segmentation Emerges from Text Supervision 目标检测ViLD : Open-vocabulary object detection via vision and language knowledge distillation 视觉定位GLIP:Grounded Language-Image P…

VsCode搭建Java开发环境 vscode搭建java开发环境 vscode springboot 搭建springboot

VsCode搭建Java开发环境 vscode搭建java开发环境 vscode springboot 搭建springboot VsCode java开发截图1、安装Java 环境相关插件2、安装 Spring 插件3、安装 Mybatis 插件第一个 vsc-mybatis第二个 mybatisX 4、安装Maven环境4.1、安装Maven环境4.2、VsCode配置Maven环境 5、…

使用Python进行Base64编码和解码

假设您有一个想要通过网络传输的二进制图像文件。您很惊讶对方没有正确接收该文件 - 该文件只是包含奇怪的字符&#xff01; 嗯&#xff0c;您似乎试图以原始位和字节格式发送文件&#xff0c;而所使用的媒体是为流文本而设计的。 避免此类问题的解决方法是什么&#xff1f;答…

Interspeech 2023 | 火山引擎流媒体音频技术之语音增强和AI音频编码

背景介绍 为了应对处理各类复杂音视频通信场景&#xff0c;如多设备、多人、多噪音场景&#xff0c;流媒体通信技术渐渐成为人们生活中不可或缺的技术。为达到更好的主观体验&#xff0c;使用户听得清、听得真&#xff0c;流媒体音频技术方案融合了传统机器学习和基于AI的语音增…

微服务--Seata(分布式事务)

TCC模式在代码中实现&#xff1a;侵入性强&#xff0c;并且的自己实现事务控制逻辑 Try&#xff0c;Confirm() cancel() 第三方开源框架&#xff1a;BeyeTCC\TCC-transaction\Himly 异步实现&#xff1a;MQ可靠消息最终一致性 GlobalTransacational---AT模式

Threejs里反向播放动画

在Blender里给对象添加了一个动画后&#xff0c;假设是在帧1到帧40添加的动画帧&#xff0c;那么正常播放时是从帧1到帧40&#xff0c;反向播放则是从帧40到帧1&#xff0c;本文讲述如何在Threejs里方向播放Blender里添加的动画。 一 添加动画 之前文章中已经讲述如何在Blende…

MAC ITEM 解决cd: string not in pwd的问题

今天使用cd 粘贴复制的路径的时候,报了这么一个错. cd: string not in pwd eistert192 Library % cd Application Support cd: string not in pwd: Application eistert192 Library % 让人一脸懵逼. 对比一下,发现中文路径里的空格截断了路径 导致后面的路径就没有办法被包含…

财报解读:迈向高端化,珍酒李渡如何持续讲好品牌故事?

2023年上半年&#xff0c;尤其是第二季度&#xff0c;白酒行业淡季属性较为明显。对于市场情况&#xff0c;中国酒业协会《2023中国白酒市场中期研究报告》也有所披露&#xff1a;约40.91%的受访者反馈春节后平日的白酒消费量有所减少&#xff0c;约31.82%的受访者反馈五一期间…

数据结构与算法(二)算法分析

算法的特性 算法具有五个基本特性&#xff1a;输入、输出、有穷性、确定性和可行性。 输入输出 算法具有零个或多个输入至少有一个或多个输出&#xff1a;算法是一定需要输出的&#xff0c;不需要输出&#xff0c;你用这个算法干吗&#xff1f; 有穷性 指算法在执行有限的步骤…

教你如何进行vcruntime140_1.dll文件下载安装,4种方法详细的安装方法

今天主要要跟大家说说vcruntime140_1.dll文件下载安装&#xff0c;其实要下载安装这个文件还是有不少方法的&#xff0c;只要不要慌&#xff0c;有的时候办法解决&#xff0c;首先我们要知道vcruntime140_1.dll是Microsoft Visual C的一部分&#xff0c;是许多计算机程序运行所…

Python项目打包与部署(1):模块与包的概念与关系

Python是动态类型编程语言&#xff0c;意味着python不需要提前编译。1个Python项目通常也包含多个.py文件&#xff0c; 通常也会引用python标准库&#xff0c;或第3方库&#xff0c;也存在着依赖关系。因此python项目也 当实际构建1个 Python 项目时&#xff0c;模块与包是我们…

【python基础教程】类中属性和方法的具体定义方法及使用

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 以下介绍在python的re模块中怎样应用正则表达式 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备…

Mybatis1.2 查询所有数据

1.2 查询所有数据 1.2.1 编写接口方法1.2.2 编写SQL语句1.2.3 编写测试方法1.2.4 起别名解决上述问题1.2.5 使用resultMap解决上述问题1.2.6 小结 如上图所示就页面上展示的数据&#xff0c;而这些数据需要从数据库进行查询。接下来我们就来讲查询所有数据功能&#xff0c;而实…

JavaScript【转】

以下内容转载和参考自&#xff1a;w3school的JavaScript学习内容&#xff0c;HTML JavaScript。 JavaScript 使 HTML 页面更具动态性和交互性&#xff0c;前面我们都是在代码中一开始就将元素的值、属性、style样式写死&#xff0c;使用JavaScript 的话就可以对这些内容动态的更…

WordPress(6)网站侧边栏倒计时进度小工具

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 效果图在这里插入图片描述一、添加位置二、主题style.css文件中添加美化1.引入库2.添加自定义的HTML模块效果图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 在主题中 child.js…

QT DAY 4

时钟&#xff1a; #include "widget.h" #include "ui_widget.h"int hour0; int min0; int sec0; int count0; Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setFixedSize(800,600);timer new …

【LeetCode-中等题】200. 岛屿数量

文章目录 题目方法一&#xff1a;深度优先搜索 dfs方法二&#xff1a;广度优先搜索 bfs方法三&#xff1a;&#xff08;重点掌握&#xff09;并查集 题目 方法一&#xff1a;深度优先搜索 dfs 思路&#xff1a;让一个扫描指针扫描每一个格子&#xff0c;然后每扫到一个为1的格…

代码随想录—力扣算法题:19删除链表的倒数第N个节点.Java版(示例代码与导图详解)

19.删除链表的倒数第N个节点 力扣题目链接 更多内容可点击此处跳转到代码随想录&#xff0c;看原版文件 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f; 示例 1&#xff1…

浅析Linux系统I/O模型

文章目录 概述阻塞式I/O模型非阻塞式I/O模型I/O多路复用模型信号驱动式I/O模型异步I/O模型相关参考 概述 在操作系统中&#xff0c;I/O类操作是相对慢速的&#xff0c;应用发起一个I/O操作&#xff0c;需要等待I/O资源就绪后&#xff0c;才能继续后面的处理。这种简单的请求-响…