最近使用ffmpeg来做一个rtsp的客户端,这过程也遇到不少问题,不过相应都比较好,一路走下来.不过到项目结尾时,且遇到一个比较纠结的问题.那就是客户端在使用的过程中,把rtsp服务器的网断了.这时客户端会卡死.无法操作.尝试了各种线程的处理,还不行.最后追踪代码来到av_read_frame这个函数.问题就出现在它身上了.当服务器断网后,这个函数会一直没有返回,且整个线程也停在那里了.

难道就没有连接超时的判断.

原来要想实现连接超时的判断,得用回调函数.网上有两种设置方法.不过我这边只有这种是有效的.

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
AVCodec         *pCodec;
 
     
 
    // Register all formats and codecs
 
     
 
    av_register_all();
 
    avcodec_register_all();
 
    avformat_network_init();
 
     
 
    pFormatCtx = avformat_alloc_context();
 
    pFormatCtx->interrupt_callback.callback = interrupt_cb;--------注册回调函数
 
    pFormatCtx->interrupt_callback.opaque = pFormatCtx;
 
    AVDictionary* options = NULL;
 
    av_dict_set(&options, "rtsp_transport""tcp", 0);
 
   // ret = avformat_open_input(&pFormatCtx, cFullPath, 0, &options);
 
    //avformat_network_init();
 
    // Open video file
 
    if(avformat_open_input(&pFormatCtx, [url cStringUsingEncoding:NSASCIIStringEncoding], 0, &options) != 0) {
 
        av_log(NULL, AV_LOG_ERROR, "Couldn't open file\n");
 
        goto initError;
 
     }

再另外定义一下函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static int interrupt_cb(void *ctx)
{
    // do something
    NSLog(@"%d",time_out);
    time_out++;
    if (time_out > 40) {
        NSLog(@"------%d", firsttimeplay);
        time_out=0;
        if (firsttimeplay) {
            firsttimeplay=0;
            NSLog(@"++++++++");
            return 1;//这个就是超时的返回
        }
    }
    return 0;
}

这样,回调函数就会一直在后台运行着,然后就可以在上面加一些逻辑让超时返回1了,返回1,系统就自动结束,把主动权交回给主线程,这样用户就可以再操作ui了,卡死的问题ok

使用ffmpeg的av_read_frame,如何控制连接超时的更多相关文章

  1. C# 控制连接超时

    首先连接超时分为三种,TCP Connection to SQL Server -> SqlConnection.Open -> SqlCommand.Execute先说第二种超时,sql ...

  2. 关于MySQL的wait_timeout连接超时问题报错解决方案

    bug回顾 : 想必大家在用MySQL时都会遇到连接超时的问题,如下图所示: ### Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsExce ...

  3. 解密FFmpeg播放track mode控制

    上一篇文章(http://www.cnblogs.com/yangdanny/p/4421130.html)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H ...

  4. MySQL连接问题【如何解决MySQL连接超时关闭】

    --MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器 ...

  5. HttpClient(二)HttpClient使用Ip代理与处理连接超时

    前言 其实前面写的那一点点东西都是轻轻点水,其实HttpClient还有很多强大的功能: (1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自动转向 (3)支持 ...

  6. (五)HttpClient 连接超时及读取超时

    第一节: HttpClient 连接超时及读取超时 HttpClient连接超时及读取超时 httpClient在执行具体http请求时候 有一个连接的时间和读取内容的时间: HttpClient连接 ...

  7. 解决ssh连接超时时间(ssh timeout)的设置方法

    本文介绍下,linux中ssh连接超时时间的设置方法,以避免总是被强行退出.有需要的朋友,参考下吧.有关修改ssh连接超时时间的方法,网上介绍的很多了.比如下面这个:可以减少ssh连接超时等待的时间: ...

  8. [PHP]socket的连接超时 与 读取/写入超时

    socket处理时有两种超时 , 分为连接超时 和 读取/写入数据超时 1. stream_socket_client 函数中的超时时间是连接超时 , 默认是php.ini中的default_sock ...

  9. 如何解决MySQL连接超时关闭

    最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到M ...

随机推荐

  1. 以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解

    转载:http://www.cnblogs.com/lifan3a/articles/6649970.html 以太网帧格式.IP数据报格式.TCP段格式+UDP段格式 详解   1.ISO开放系统有 ...

  2. oracle关键字大全--注意不要乱用哦

    遇到怀疑可能使用了关键字,就来搜一搜吧 ... Oracle 关键字(保留字) 大全 其实这个东西可以在oracle 上输入一个sql语句就可以得到: select * from v$reserved ...

  3. Matlab图形调色

    Matlab图形调色 Simple example var colormap = require('colormap') options = {   colormap: 'jet',   // pic ...

  4. 修改easyui的easyloader的默认css目录路径

    easyloader默认情况下会使用js文件所在目录下的themes文件夹中的css,这里改成项目自定义的css文件夹. 首先找到: var m=src.match(/easyloader\.js(\ ...

  5. man-pages项目包含文档的说明

    man-pages项目是由linux kernel维护的一个文档项目,但是,该项目中只是包含了部分常用文档,还有大量gnu常用系统工具的manpanges没有包含,但一些在线网站提供一个详细版本的ma ...

  6. vim:将刚写的单词大写和单词的定义

    最近打算把caps lock映射成<esc>键,那按起来多爽,现在的有一个小问题,如何快捷的输入大写字母. 用这个键盘映射搞定. inoremap <c-u> <esc& ...

  7. jar包调用jar包内部和外部的配置文件

    http://blog.csdn.net/lpftobetheone/article/details/32689467 **************************************** ...

  8. 【查询优化】怎样用SQL语句查看查询的性能指标

    一.SET STATISTICS IO  (有关TSQL语句查询所产生的磁盘活动量) --显示有关由Transact-SQL 语句生成的磁盘活动量的信息 SET STATISTICS IO ON -- ...

  9. ubuntu16.04中文乱码解决方案

    把环境变量设置为中文 </pre><pre name="code" class="plain">sudo vi /etc/default ...

  10. VxWorks中logMsg与printf的区别

    printf( ) - write a formatted string to the standard output stream (ANSI). logMsg( ) does not actual ...