我很困惑。我使用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;
}也许它应该根据不同的协议(http或rtsp)来设置时间单位。
上面的代码对吗?
发布于 2020-06-09 00:01:56
TL;DR
因此,只需相应地将当前值*1000乘以HTTP部分即可。
完整
我有一个C++应用程序,它使用libav来对进行编码,这是一个H.264/AAC流,并将其推送到本地RTSP服务器,然后由后者提供服务。此外,我还有另一个C++应用程序,它使用libav来解码这个RTSP流,从数据包中提取视频/音频数据,重新分配它们,并使用SFML显示缓冲区中的像素数据。
在解码应用程序中,我使用timeout选项来确定RTSP流是否可用。这是一个可选参数,但如果解码过程比可用的RTSP流更早启动,则如果未设置timeout,则解码进程挂起。这是因为RTSP和HTTP协议的默认值是-1,这意味着“无限等待”。如果您将其设置为不同的值,并且发生这种情况,avformat_open_input将返回一个可以进一步分析的AVERROR代码,例如,您可以通过简单地重新开始重新连接到RTSP流的新尝试,从而使您对执行流有更好的控制。
所以问题是:“,这个值的正确时间基础是什么,这样我就可以相应地使用它了?”
作为文档化的这里,对于RTSP协议,您可以设置timeout选项以建立打开流所需的最大时间。在RTSP一节中,指南解释说,这个值是以秒来估计的。
超时 设置最大超时时间(以秒为单位)以等待传入连接。 值-1表示无限(默认)。此选项意味着将rtsp_flags设置为“侦听”。
虽然它没有为RTMP协议指定它,但是我已经通过将我的RTSP 更改为RTMP URL来测试它,而不更改时间基,并且它按预期工作,所以我的推论是,这两个协议共享相同的时间基。
另外,在相同的页面这里中,对于HTTP协议,您可以为相同的目的设置timeout值,但是时间基必须在中
超时 设置底层低级别操作所使用的套接字I/O操作的超时(以微秒为单位)。默认情况下,它被设置为-1,这意味着没有指定超时。
因此,在您的情况下,您需要替换,因为您期望的时间基是不正确的(我假设您的意思是milliseconds__),正确的是microseconds,,以便有一个6s超时而不是0.006s超时):
else if(strncmp(stream_url, "http:", sizeof("http:")) == 0){
av_dict_set(&opts, "timeout", "6000", 0); // in ms
}在这方面:
else if(strncmp(stream_url, "http:", sizeof("http:")) == 0){
av_dict_set(&opts, "timeout", "6000000", 0); // In microseconds
}正如您的示例所演示的那样,您已经分配了一个格式上下文;然后,在打开您的流之前,创建一个AVDictionary并使用av_dict_set设置timeout值。您还可以设置其他选项。所有这些信息都是通过将刚刚创建和配置的字典作为引用传递给avformat_open_input的。
正如所描述的在第405行中为libavformat\utils.c,字典信息将被复制到解码器格式上下文priv_data,并将用于打开流。
如果触发超时,该函数将返回一个AVERROR代码。
avformat_network_init();
AVFormatContext* muxer_receiver = avformat_alloc_context();
AVDictionary* options = NULL;
av_dict_set(&options, "timeout", "3", 0);
if(avformat_open_input(&muxer_receiver, "rtsp://:32400/live/1", NULL, &options)!=0){
return EXIT_FAILURE;
}
if(avformat_find_stream_info(muxer_receiver, NULL)<0){
return EXIT_FAILURE;
}
// Do stuff like retrieving video and audio streams index
av_read_play(muxer_receiver);https://stackoverflow.com/questions/34034125
复制相似问题