ICY*_*MYM 8 timeout ffmpeg http rtsp
我很迷惑。我正在使用该av_dict_set
功能设置超时,但是当我搜索有关 的信息时av_dict_set
,时间单位似乎不同。我现在不知道怎么设置。任何人都可以帮忙吗?
我发现了一些类似如下的代码:
pFormatCtx = avformat_alloc_context();
av_dict_set(&opts, "rtsp_transport", "tcp", 0);
//av_dict_set(&opts, "timeout", "5000000", 0);
if(strncmp(stream_url, "rtmp:", sizeof("rtmp:")) == 0){
av_dict_set(&opts, "timeout", "6", 0); // in secs
}
else if(strncmp(stream_url, "http:", sizeof("http:")) == 0){
av_dict_set(&opts, "timeout", "6000", 0); // in ms
}
if(avformat_open_input(&pFormatCtx, stream_url, NULL, &opts)!=0)
{
return 1;
}
Run Code Online (Sandbox Code Playgroud)
也许它应该根据不同的协议(http 或 rtsp)设置时间单位。
上面的代码对吗?
长话短说
\n因此,只需将当前值乘以 1000 来相应地修复 HTTP 部分即可。
\n满的
\n我有一个 C++ 应用程序,它使用libav对H.264 /AAC RTSP 流进行编码,并将其推送到本地 RTSP 服务器,然后由该服务器提供服务。另外,我还有另一个 C++ 应用程序,它使用 libav 来解码此 RTSP 流、从数据包中提取视频/音频数据、重新缩放它们并使用 SFML 显示缓冲区中的像素数据。
\n在解码应用程序中,我使用timeout
选项来确定 RTSP 流是否可用。这是一个可选参数,但如果解码过程早于 RTSP 流可用,则如果timeout
未设置,解码过程将挂起。发生这种情况是因为 RTSP 和 HTTP 协议的默认值为-1
,这意味着“无限等待”。如果您将其设置为不同的值并且发生这种情况,avformat_open_input
将返回AVERROR
您可以进一步分析的代码,例如您可以通过简单地重新开始来重新尝试重新连接到 RTSP 流,从而使您可以更好地控制您的执行流程。
所以问题是:“这个值的正确时基是什么,以便我可以相应地使用它? ”
\n如此处所述,对于RTSP 协议,您可以设置timeout
选项来确定等待打开流所需的最长时间。在RTSP部分,指南明确指出该值以秒为单位估计为单位估计:
\n\n暂停
\n设置等待传入连接的最大超时(以秒为单位)。
\n值 -1 表示无限(默认)。此选项意味着 rtsp_flags 设置为 \xe2\x80\x98listen\xe2\x80\x99。
\n
虽然它没有为RTMP 协议指定它,但我已经通过将RTSP URL更改为RTMP URL对其进行了测试而不更改时基来
\n另外,在同一页面中,对于HTTP协议,您可以timeout
出于相同目的设置值,但时基必须以微秒为单位为单位。
\n\n暂停
\n设置底层低级操作使用的套接字 I/O 操作的超时(以微秒为单位)。默认设置为-1,表示不指定超时时间。
\n
因此,在您的情况下,您需要替换,因为您期望的时基不正确(我假设您的意思是毫秒),而正确的时基是微秒,以便有 6s 超时而不是 0.006s 超时:
\nelse if(strncmp(stream_url, "http:", sizeof("http:")) == 0){\n av_dict_set(&opts, "timeout", "6000", 0); // in ms\n}\n
Run Code Online (Sandbox Code Playgroud)\n有了这个:
\nelse if(strncmp(stream_url, "http:", sizeof("http:")) == 0){\n av_dict_set(&opts, "timeout", "6000000", 0); // In microseconds\n}\n
Run Code Online (Sandbox Code Playgroud)\n正如您的示例所示,您已经分配了一个格式上下文;然后,在打开流之前,您创建一个AVDictionary
并使用 设置timeout
值av_dict_set
。您还可以设置其他选项。所有这些信息都是avformat_open_input
通过传递刚刚创建和配置的字典作为引用来传递的。
如libavformat\\utils.c 中第 405 行所述,字典信息将被复制到解码器格式上下文priv_data
,并用于打开流。
如果触发超时,该函数将返回一个AVERROR
代码。
avformat_network_init();\nAVFormatContext* muxer_receiver = avformat_alloc_context();\nAVDictionary* options = NULL;\nav_dict_set(&options, "timeout", "3", 0);\nif(avformat_open_input(&muxer_receiver, "rtsp://:32400/live/1", NULL, &options)!=0){\n return EXIT_FAILURE;\n}\nif(avformat_find_stream_info(muxer_receiver, NULL)<0){\n return EXIT_FAILURE;\n}\n// Do stuff like retrieving video and audio streams index\nav_read_play(muxer_receiver);\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
1387 次 |
最近记录: |