博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用ffmpeg的av_read_frame,如何控制连接超时
阅读量:6896 次
发布时间:2019-06-27

本文共 1418 字,大约阅读时间需要 4 分钟。

  最近使用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

转载地址:http://agddl.baihongyu.com/

你可能感兴趣的文章
C/S架构应用程序开发培训笔记
查看>>
一周规划汇总_2016-09-04
查看>>
POST中文乱码解决方案
查看>>
如何快速有效的修改java的环境变量
查看>>
Android项目实战(二十六):蓝牙连接硬件设备开发规范流程
查看>>
Javascript正则表达式的初步学习
查看>>
Android 手机卫士--对话初次设置密码验证过程
查看>>
c#泛型方法返回null的问题
查看>>
Windows Server 2003、2008、2012系统的安装
查看>>
sublime text2 快捷键
查看>>
次郎的寿司梦
查看>>
Redhat系统部署安装Splunk
查看>>
线程中的同步辅助类Semaphore
查看>>
iOS怎样找到自己的沙盒
查看>>
音频特征提取——pyAudioAnalysis工具包
查看>>
图像卷积与滤波的一些知识点(转)
查看>>
深度学习的模型是怎么训练/优化出来的
查看>>
基于.NET Framework 的Windows应用程序如何回收内存
查看>>
老外的.net extjs封装
查看>>
在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)
查看>>