ffmpeg用avformat_open_input()解析网络流时,默认是阻塞的。

当遇到解析错误的网络流时,会导致该函数长时间不返回。

为此可以设置ffmpeg的-stimeout 的参数,要注意 -stimeout的单位是us 微妙。

用法就是设置在解析的 url 之前 (这里设置超时为5秒)即:

“ffmpeg -stimeout 5000000  -i rtsp://admin:admin@192.168.7.102:554/h264...........”

或者:

“ffmpeg -stimeout 5000000 -rtsp_transport tcp  -i rtsp://admin:12345@172.16.7.166:554/h264.....”

备注:-stimeout 设置在你要解析的url之后是没有作用的。

=============================================

从网络上搜索到的有关资料:

一:

“去看ffmpeg的tcp.c的源代码(会阻塞的网络地址基本都是tcp协议),搜索上面两个关键字,就明白是如何退出了。我之前的文章只说了open的时候阻塞,其实网络环境复杂,有可能在read或write时候断网或阻塞异常。但根基却是在tcp.c这个文件里。把interrupt_callback和timeout设置好了,就可以解决这些问题。”

二:

“ffmpeg的avformat_open_input()默认是阻塞的,用户可以通过设置“ic->flags |= AVFMT_FLAG_NONBLOCK;”设置成非阻塞(通常是不推荐的);或者是设置timeout设置超时时间;或者是设置interrupt_callback定义返回机制。

附一段代码参考下吧。

ic = avformat_alloc_context();
    if(ic == NULL){
        ERR("error avformat_alloc_context \n");
        return -1;
    }
    ic->interrupt_callback.callback = tvie_decode_interrupt_cb;
    ic->interrupt_callback.opaque = handle;

//ic->flags |= AVFMT_FLAG_NONBLOCK;

if(strncmp(handle->params.path, "rtmp:", sizeof("rtmp:")) == 0){
        av_dict_set(&opts, "timeout", "6", 0); // in secs

}
    else if(strncmp(handle->params.path, "http:", sizeof("http:")) == 0){
        av_dict_set(&opts, "timeout", "6000", 0); // in ms
    }

err = avformat_open_input(&ic, handle->params.path, NULL, &opts);

ffmpeg设置avformat_open_input( )超时 -stimeout的更多相关文章

  1. ffmpeg问题汇总及解决方案 <设置avformat_open_input 超时><转>

    1:如果数据是rtp/rtsp传输的话,ffmpeg会每隔30s(哪里设置该值?)发送一个keepalive包,如果ipc支持GET_PARAMETER命令,就发该命令等ipc回复以确认ipc还活着. ...

  2. C# 的tcp Socket设置自定义超时时间

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  3. 【开源项目13】Volley框架 以及 设置request超时时间

    Volley提供了优美的框架,使android程序网络访问更容易.更快. Volley抽象实现了底层的HTTP Client库,我们不需关注HTTP Client细节,专注于写出更加漂亮.干净的RES ...

  4. android 中设置HttpURLConnection 超时并判断是否超时

    设置超时: URL url1 = new URL(url); HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); c ...

  5. oracle连接由于防火墙设置导致超时的问题

        当应用程序使用数据库连接池进行数据连接时,防火墙的设置有可能会导致连接出现超时或者被重置的问题.当从数据库读数据的时候 有可能会 Connection timed out, 这是由于应用会缓存 ...

  6. iOS 设置connect超时

    NSLock *theLock; [theLock lock]; int fd, error; struct sockaddr_in addr; ))<) { cout<<" ...

  7. 设置session超时

    在web应用中,设置session超时有三种方法: 1.在web.xml文件中配置:单位是分钟,范围是针对本项目所有用户的session <session-config> <sess ...

  8. Dynamics CRM可以设置会话超时和非活动超时吗?

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复266或者20171213可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  9. Retrofit2.0 设置 连接超时

    Retrofit2.0 这个网络请求框架使用了很久了,最近一次出现一个小插曲. 有一个接口,返回的数据量因为业务的原因 会返回很大的数据量,此时网络不大好的情况下,会出现请求失败的情况 也就是回调了 ...

随机推荐

  1. OC-通知+Block

    =================================== 一.通知(NSNotification) NSNotification 通知类,这个类中有 NSNotificationCent ...

  2. (十二)break,continue

    class Break { //break,continue public static void main(String[] args) { //break for(int i =0;i<=5 ...

  3. 深入分析AIDL原理

    深入分析AIDL原理 分类: Android2011-11-18 17:29 6522人阅读 评论(1) 收藏 举报 descriptorcallbackservicenullinterfaceser ...

  4. vue 相邻自定义组件渲染错误正确的打开方式

    话不多说看问题: 当封装自定义组件时例如(自定义下拉列表)两个相同的组件在多次v-if变化时偶尔会发生渲染错误,明明赋值正确但是组建中的ajax方法可能返回的数据乱掉,或者其他神逻辑错误. 经过查询发 ...

  5. Cocoapods的操作

    1.卸载Cocoapods命令: sudo gem uninstall cocoapods 2.安装Cocoapods的命令: >安装最新版本 sudo gem install cocoapod ...

  6. ORA-00845 : MEMORY_TARGET not supported on this system(调大数据库内存无法启动)

    问题描述:调大数据库内存后,启动数据库报 ORA-00845 : MEMORY_TARGET not supported on this system . -- 调大数据库内存后,数据库启动报错[ro ...

  7. CentOS中使用Shell脚本实现每天自动备份网站文件和数据库并上传到FTP中(转)

    http://www.jb51.net/article/58843.htm 一.安装Email发送程序 复制代码 代码如下: yum install sendmail mutt 二.安装FTP客户端程 ...

  8. bzoj 3612 [Heoi2014]平衡——整数划分(dp)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3612 因为力矩的缘故,变成了整数划分. 学习到了整数划分.就是那个图一样的套路.https: ...

  9. Python3 的urllib实例

    在Python3中合并了 urllib 和 urllib2, 统一命名为 urllib 了,我觉得这样更加合理了.让我们可以像读取本地文件一样读取WEB上的数据.封装了一个类,供以后方便使用吧!并附带 ...

  10. SpringMvc访问Controller去掉do

    只需要修改web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xs ...