1:
如果数据是rtp/rtsp传输的话,ffmpeg会每隔30s(哪里设置该值?)发送一个keepalive包,如果ipc支持GET_PARAMETER命令,就发该命令等ipc回复以确认ipc还活着。
某些ipc(IPCamera)不支持GET_PARAMETER的rtsp命令。则会通过OPTIONS *来是keepalive,不过这会导致连接断掉
原代码,及修改部分如下。先这样处理,有时间再研究原代码为什么不这么处理。

//ffmpeg/libavformat/rtspdec.c rtsp_read_packet()
if (!(rt->rtsp_flags & RTSP_FLAG_LISTEN)) {
/* send dummy request to keep TCP connection alive */
if ((av_gettime() - rt->last_cmd_time) / >= rt->timeout / ||
rt->auth_state.stale) {
if (rt->server_type == RTSP_SERVER_WMS ||
(rt->server_type != RTSP_SERVER_REAL &&
rt->get_parameter_supported)) {
ff_rtsp_send_cmd_async(s, "GET_PARAMETER", rt->control_uri, NULL);
} else {
// ff_rtsp_send_cmd_async(s, "OPTIONS", "*", NULL); //原代码
ff_rtsp_send_cmd_async(s, "OPTIONS", rt->control_uri, NULL); //修改后的代码,这样就算ipc不支持GET_PARAMETER的命令可以keepalive了
}
/* The stale flag should be reset when creating the auth response in
* ff_rtsp_send_cmd_async, but reset it here just in case we never
* called the auth code (if we didn't have any credentials set). */
rt->auth_state.stale = ;
}
}

2:
如果数据是rtp/rtsp/tcp传输,如果没有设置stimeout(socket timeout),那么server断线后av_read_frame会阻塞

AVFormatContext *pFormatCtx = NULL;
AVPacket packet;
AVDictionary *optionsDict = NULL;
char *streamurl1 = "rtsp://test:test@192.168.11.111:554/test.stream"; // Register all formats and codecs
av_register_all();
avformat_network_init(); pFormatCtx = avformat_alloc_context();
av_dict_set(&optionsDict, "rtsp_transport", "tcp", ); //采用tcp传输
av_dict_set(&optionsDict, "stimeout", "", ); //如果没有设置stimeout,那么把ipc网线拔掉,av_read_frame会阻塞(时间单位是微妙) // Open video file
if(avformat_open_input(&pFormatCtx, streamurl, NULL, &optionsDict)!=){
printf("linesize = %d\n", __LINE__);
return -; // Couldn't open file
} // Retrieve stream information
if(avformat_find_stream_info(pFormatCtx, NULL)<){
printf("linesize = %d\n", __LINE__);
return -; // Couldn't find stream information
} // Find the first video stream
int videoStream=-;
for(i=; i<pFormatCtx->nb_streams; i++){
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
videoStream=i;
break;
}
} if(videoStream==-){
printf("linesize = %d\n", __LINE__);
return -; // Didn't find a video stream
} // Read frames and save first five frames to disk
while(av_read_frame(pFormatCtx, &packet)>=) {
av_free_packet(&packet);
}

如果是ffmpeg2.0.1版本的话,添加一句就ok了。可是旧版本ffmpeg1.2.*没有stimeout这个字段可以设置
那么只好自己添加了。
在ffmpeg/libavformat/rtsp.h  struct RTSPState添加一个stimeout字段

typedef struct RTSPState {
/**
* timeout of socket i/o operations.(this version do not have this segment. added by yqing, refer to ffmpeg-2.0.1)
*/
int stimeout;
} RTSPState;

在ffmpeg/libavformat/rtsp.c  ff_rtsp_options添加一个stimeout字段

const AVOption ff_rtsp_options[] = {
{ "stimeout", "timeout (in micro seconds) of socket i/o operations.", OFFSET(stimeout), AV_OPT_TYPE_INT, {.i64 = }, INT_MIN, INT_MAX, DEC }, //添加这行代码
RTSP_REORDERING_OPTS(),
{ NULL },
};

在ffmpeg/libavformat/rtsp.c  ff_rtsp_connect函数修改部分代码如下

//ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, host, port, NULL);                            //原代码
ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, host, port, "?timeout=%d", rt->stimeout); //修改后的代码

原贴地址:http://blog.chinaunix.net/uid-27091949-id-4186640.html

1:
如果数据是rtp/rtsp传输的话,ffmpeg会每隔30s(哪里设置该值?)发送一个keepalive包,如果ipc支持GET_PARAMETER命令,就发该命令等ipc回复以确认ipc还活着。
某些ipc(IPCamera)不支持GET_PARAMETER的rtsp命令。则会通过OPTIONS *来是keepalive,不过这会导致连接断掉
原代码,及修改部分如下。先这样处理,有时间再研究原代码为什么不这么处理。

点击(此处)折叠或打开

  1. //ffmpeg/libavformat/rtspdec.c rtsp_read_packet()
  2. if (!(rt->rtsp_flags & RTSP_FLAG_LISTEN)) {
  3. /* send dummy request to keep TCP connection alive */
  4. if ((av_gettime() - rt->last_cmd_time) / 1000000 >= rt->timeout / 2 ||
  5. rt->auth_state.stale) {
  6. if (rt->server_type == RTSP_SERVER_WMS ||
  7. (rt->server_type != RTSP_SERVER_REAL &&
  8. rt->get_parameter_supported)) {
  9. ff_rtsp_send_cmd_async(s, "GET_PARAMETER", rt->control_uri, NULL);
  10. } else {
  11. // ff_rtsp_send_cmd_async(s, "OPTIONS", "*", NULL);                 //原代码
  12. ff_rtsp_send_cmd_async(s, "OPTIONS", rt->control_uri, NULL);        //修改后的代码,这样就算ipc不支持GET_PARAMETER的命令可以keepalive了
  13. }
  14. /* The stale flag should be reset when creating the auth response in
  15. * ff_rtsp_send_cmd_async, but reset it here just in case we never
  16. * called the auth code (if we didn't have any credentials set). */
  17. rt->auth_state.stale = 0;
  18. }
  19. }

2:
如果数据是rtp/rtsp/tcp传输,如果没有设置stimeout(socket timeout),那么server断线后av_read_frame会阻塞

点击(此处)折叠或打开

  1. AVFormatContext *pFormatCtx = NULL;
  2. AVPacket packet;
  3. AVDictionary *optionsDict = NULL;
  4. char *streamurl1 = "rtsp://test:test@192.168.11.111:554/test.stream";
  5. // Register all formats and codecs
  6. av_register_all();
  7. avformat_network_init();
  8. pFormatCtx = avformat_alloc_context();
  9. av_dict_set(&optionsDict, "rtsp_transport", "tcp", 0);                //采用tcp传输
  10. av_dict_set(&optionsDict, "stimeout", "2000000", 0);                  //如果没有设置stimeout,那么把ipc网线拔掉,av_read_frame会阻塞(时间单位是微妙)
  11. // Open video file
  12. if(avformat_open_input(&pFormatCtx, streamurl, NULL, &optionsDict)!=0){
  13. printf("linesize = %d\n", __LINE__);
  14. return -1; // Couldn't open file
  15. }
  16. // Retrieve stream information
  17. if(avformat_find_stream_info(pFormatCtx, NULL)<0){
  18. printf("linesize = %d\n", __LINE__);
  19. return -1; // Couldn't find stream information
  20. }
  21. // Find the first video stream
  22. int videoStream=-1;
  23. for(i=0; i<pFormatCtx->nb_streams; i++){
  24. if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
  25. videoStream=i;
  26. break;
  27. }
  28. }
  29. if(videoStream==-1){
  30. printf("linesize = %d\n", __LINE__);
  31. return -1; // Didn't find a video stream
  32. }
  33. // Read frames and save first five frames to disk
  34. while(av_read_frame(pFormatCtx, &packet)>=0) {
  35. av_free_packet(&packet);
  36. }

如果是ffmpeg2.0.1版本的话,添加一句就ok了。可是旧版本ffmpeg1.2.*没有stimeout这个字段可以设置
那么只好自己添加了。
在ffmpeg/libavformat/rtsp.h  struct RTSPState添加一个stimeout字段

点击(此处)折叠或打开

  1. typedef struct RTSPState {
  2. /**
  3. * timeout of socket i/o operations.(this version do not have this segment. added by yqing, refer to ffmpeg-2.0.1)
  4. */
  5. int stimeout;
  6. } RTSPState;

在ffmpeg/libavformat/rtsp.c  ff_rtsp_options添加一个stimeout字段

点击(此处)折叠或打开

  1. const AVOption ff_rtsp_options[] = {
  2. { "stimeout", "timeout (in micro seconds) of socket i/o operations.", OFFSET(stimeout), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, DEC },    //添加这行代码
  3. RTSP_REORDERING_OPTS(),
  4. { NULL },
  5. };

在ffmpeg/libavformat/rtsp.c  ff_rtsp_connect函数修改部分代码如下

点击(此处)折叠或打开

  1. //ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, host, port, NULL);                            //原代码
  2. ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, host, port, "?timeout=%d", rt->stimeout);     //修改后的代码

ffmpeg问题汇总及解决方案 <设置avformat_open_input 超时><转>的更多相关文章

  1. ffmpeg设置avformat_open_input( )超时 -stimeout

    ffmpeg用avformat_open_input()解析网络流时,默认是阻塞的. 当遇到解析错误的网络流时,会导致该函数长时间不返回. 为此可以设置ffmpeg的-stimeout 的参数,要注意 ...

  2. 【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置

    场景描述: ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题 1.ajax的timeout属性设置 前端请求超时事件[网络连接不稳定时候,就无效了] var data = ...

  3. flume常见异常汇总以及解决方案

    flume常见异常汇总以及解决方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际生产环境中,我用flume将kafka的数据定期的往hdfs集群中上传数据,也遇到过一系列的坑 ...

  4. H5项目常见问题汇总及解决方案

    H5项目常见问题汇总及解决方案 H5   2015-12-06 10:15:33 发布 您的评价:       4.5   收藏     4收藏 H5项目常见问题及注意事项 Meta基础知识: H5页 ...

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

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

  6. 【转】使用kettle工具遇到的问题汇总及解决方案

    使用kettle工具遇到的问题汇总及解决方案   转载文章版权声明:本文转载,原作者薄海 ,原文网址链接 http://blog.csdn.net/bohai0409/article/details/ ...

  7. H5 常见问题汇总及解决方案

    原文链接:http://mp.weixin.qq.com/s/JVUpsz9QHsNV0_7U-3HCMg H5 项目常见问题汇总及解决方案 -- 由钟平勇分享 转自 https://github.c ...

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

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

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

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

随机推荐

  1. Tomcat 配置虚拟路径保存、访问图片

    转载自:https://www.cnblogs.com/magic101/p/7756402.html 配置tomcat的虚拟映射路径 1.修改Tomcat的server.xml文件 <Host ...

  2. BZOJ1229 USACO2008 Nov toy 玩具 【三分+贪心】*

    BZOJ1229 USACO2008 Nov toy 玩具 Description 玩具 [Chen Hu, 2006] Bessie的生日快到了, 她希望用D (1 <= D <= 10 ...

  3. 《DSP using MATLAB》示例9.2

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  4. 给网站添加IPv6 DNS记录

    一. 1) 使6box提供的DNS64服务,解析出自己网站对应的IPv6域名 Windows: Win+R打开运行,输入cmd,打开命令提示符,输入以下命令 Nslookup www.6box.cn  ...

  5. vi/vim显示中文字符并且去掉^M的方法

    vim上经常会碰到中文显示不正常的现象,也就是传说中的乱码.搜索了一下,在 http://www.chinalinuxpub.com/bbs/showthread.php?t=45475 找到了一个解 ...

  6. python笔试面试题_视频中(待完善)

    一.选择填空题 1. 用一行代码交换a,b的值 a,b = 1,2 print(a,b) a,b = b,a print(a,b) 2. 元祖中有一个元素,有逗号则类型是元祖,无逗号则是远数据类型 t ...

  7. bootstrap常用模态框

    <!-- 触发器(button) --> <button class="btn btn-xs btn-success" data-toggle="mod ...

  8. 全局获取Context

    1.定制一个Application类,管理全局的状态信息 public class MyApplication extends Application{ private static Context ...

  9. 【JS】if...else 优化形式

    if () {} else {} —— 使用三元操作符/省略大括号{} if(foo){ funcA(); }else{ funcB(); } foo?funcA():funcB(); if(!foo ...

  10. MySQL 5.7.18 主从复制 Error1205

    从库报 error 1205 1.mysql报错信息 [root@slave2(35.102) ~]# mysql -uroot -p Enter password: Welcome to the M ...