ffmpeg问题汇总及解决方案 <设置avformat_open_input 超时><转>
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,不过这会导致连接断掉
原代码,及修改部分如下。先这样处理,有时间再研究原代码为什么不这么处理。
点击(此处)折叠或打开
- //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) / 1000000 >= rt->timeout / 2 ||
- 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 = 0;
- }
- }
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", 0); //采用tcp传输
- av_dict_set(&optionsDict, "stimeout", "2000000", 0); //如果没有设置stimeout,那么把ipc网线拔掉,av_read_frame会阻塞(时间单位是微妙)
- // Open video file
- if(avformat_open_input(&pFormatCtx, streamurl, NULL, &optionsDict)!=0){
- printf("linesize = %d\n", __LINE__);
- return -1; // Couldn't open file
- }
- // Retrieve stream information
- if(avformat_find_stream_info(pFormatCtx, NULL)<0){
- printf("linesize = %d\n", __LINE__);
- return -1; // Couldn't find stream information
- }
- // Find the first video stream
- int videoStream=-1;
- for(i=0; i<pFormatCtx->nb_streams; i++){
- if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
- videoStream=i;
- break;
- }
- }
- if(videoStream==-1){
- printf("linesize = %d\n", __LINE__);
- return -1; // Didn't find a video stream
- }
- // Read frames and save first five frames to disk
- while(av_read_frame(pFormatCtx, &packet)>=0) {
- 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 = 0}, 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); //修改后的代码
ffmpeg问题汇总及解决方案 <设置avformat_open_input 超时><转>的更多相关文章
- ffmpeg设置avformat_open_input( )超时 -stimeout
ffmpeg用avformat_open_input()解析网络流时,默认是阻塞的. 当遇到解析错误的网络流时,会导致该函数长时间不返回. 为此可以设置ffmpeg的-stimeout 的参数,要注意 ...
- 【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置
场景描述: ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题 1.ajax的timeout属性设置 前端请求超时事件[网络连接不稳定时候,就无效了] var data = ...
- flume常见异常汇总以及解决方案
flume常见异常汇总以及解决方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际生产环境中,我用flume将kafka的数据定期的往hdfs集群中上传数据,也遇到过一系列的坑 ...
- H5项目常见问题汇总及解决方案
H5项目常见问题汇总及解决方案 H5 2015-12-06 10:15:33 发布 您的评价: 4.5 收藏 4收藏 H5项目常见问题及注意事项 Meta基础知识: H5页 ...
- oracle连接由于防火墙设置导致超时的问题
当应用程序使用数据库连接池进行数据连接时,防火墙的设置有可能会导致连接出现超时或者被重置的问题.当从数据库读数据的时候 有可能会 Connection timed out, 这是由于应用会缓存 ...
- 【转】使用kettle工具遇到的问题汇总及解决方案
使用kettle工具遇到的问题汇总及解决方案 转载文章版权声明:本文转载,原作者薄海 ,原文网址链接 http://blog.csdn.net/bohai0409/article/details/ ...
- H5 常见问题汇总及解决方案
原文链接:http://mp.weixin.qq.com/s/JVUpsz9QHsNV0_7U-3HCMg H5 项目常见问题汇总及解决方案 -- 由钟平勇分享 转自 https://github.c ...
- C# 的tcp Socket设置自定义超时时间
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- 【开源项目13】Volley框架 以及 设置request超时时间
Volley提供了优美的框架,使android程序网络访问更容易.更快. Volley抽象实现了底层的HTTP Client库,我们不需关注HTTP Client细节,专注于写出更加漂亮.干净的RES ...
随机推荐
- VMWare安装Ubuntu及配置开发环境遇到的问题集
安装完Ubuntu改为中文,发现是中英文混搭的界面 sudo apt-get install $(check-language-support --language=zh_CN)更新语言包. Ecli ...
- HTTP请求报头及其处理
ps:详细说明http://www.cnblogs.com/kkgreen/archive/2011/04/11/2012829.html
- Linux shell字符串截取与拼接
一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1 # 号截取,删除左边字符,保留右边字符. echo ${va ...
- MD5加盐加密
package com.chauvet.utils; import java.security.NoSuchAlgorithmException; import java.util.Random; / ...
- 搭建jetbrains 注册服务器
wget http://home.ustc.edu.cn/~mmmwhy/jetbrain.sh && sh ./jetbrain.sh 输入默认的端口号跟用户名,然后记住服务器地址. ...
- {Reship}{Sparse Representation}稀疏表示
===================================================== http://blog.sina.com.cn/s/blog_6d0e97bb01015wo ...
- postcss gulp 安装使用
备注: 测试使用的是gulp 进行的编译 1. 项目初始化 npm init mkdir src touch app.css body{ display: flex; } 2. 安装(gulp ...
- 自定义元素(custom elements)
记录下自定义html自定义元素的相关心得: 浏览器将自定义元素保留在 DOM 之中,但不会任何语义.除此之外,自定义元素与标准元素都一致 事实上,浏览器提供了一个HTMLUnknownElement, ...
- GNU Radio安装教程: Ubuntu14.04 + uhd3.10.0 + gnuradio3.7.10.1
1. 更新和安装依赖项 在编译安装uhd和gnuradio之前,确保已安装所需依赖项.Ubuntu系统运行: sudo apt-get update 安装UHD和GNURadio所需依赖项: On U ...
- 搭建基于hyperledger fabric的联盟社区(七) --升级chaincode
上个版本的chaincode有很多功能不完备,所以要部署新版本的chaincode.Fabric支持在保留现有状态的前提对chaincode进行升级. 一.新版chaincode 新版本的chainc ...